InterlockedIncrement не срабатывает
От: Аноним  
Дата: 17.06.11 07:12
Оценка:
На 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 не срабатывает

Что делать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.