На x64
В одном потоке на нулевом проце в переменную обьявленную
__declspec(align(64)) short volatile GoGoEnd;
записывается "2"
Затем в двух потоках ( на ядре 0 и 1 ) на двуядерном проце делается _InterlockedDecrement16 ( & GoGoEnd );
И затем каждый поток ждет когда переменная облулиться
И цикл продолжается.
Одним словом вот так примерно выглядит
Это код который выполняется на ядрах >= "1"
__declspec(align(64)) short volatile GoGoEnd;
// на ядрах больше нуля
DWORD WINAPI ThreadProc ( __in LPVOID lpParameter )
{
CLASS99 * _this = ( CLASS99 *) lpParameter;
while ( 1 ){
while ( ! /* _this-> */ GoGoEnd )
;
_this->_DoRuns();
_InterlockedDecrement16 ( & /*_this-> */ GoGoEnd );
while ( /* _this-> */ GoGoEnd ) // цикл 2
;
}
}
Это код который выполняется на ядре "0"
GoGoEnd = ProcessorCount ;//2
_DoRuns();
_InterlockedDecrement16 ( & GoGoEnd );
while ( GoGoEnd ) // цикл 2
;
И вот примерно на 1000 прогоне оба потока начинают циклить на цикле 2, значение GoGoEnd равно 1
То есть явно InterlockedDecrement16 не срабатывает
Что делать?