C ++ это как параметр потока, переменные недоступны - PullRequest
3 голосов
/ 13 мая 2010

У меня есть три класса:

class Rtss_Generator {
    int mv_transfersize;
}
class Rtss_GenSine : Rtss_Generator
class Rtss_GenSineRpm : Rtss_GenSine

Rtss_GenSine создает поток в своем конструкторе, он запускается немедленно, а функция потока вне курса объявляется статической, ожидая начала вычисления события.

проблема: все переменные, к которым осуществляется доступ через указатель gen, равны 0, но это не дает сбоя. Кроме того, this-address в конструкторе и gen-pointer-address в потоке совпадают, поэтому указатель в порядке.

этот код создается и компилируется в Visual Studio 6.0 с пакетом обновления 2003

ОРИГИНАЛЬНЫЙ КОД

no thread

Rtss_GenSine::getNextData() {
    //[CALCULATION]
    //mv_transferSize is accessible and has ALWAYS value 1600 which is ok
} 

НОВЫЙ КОД

Rtss_GenSine::Rtss_GenSine() {
   createThread(NULL, threadFunction, (LPVOID) this,0,0);
}

Rtss_GenSine::getNextData() {
     SetEvent(startCalculating);


     WaitForSingleObject(stoppedCalculaing, INFINITE);
} 

DWORD Rtss_GenSine::threadFunction(LPVOID pParam) {
    Rtss_GenSine* gen = (Rtss_GenSine*) pParam;

    while(runThread) {
        WaitForSingleObject(startCalculating, INFINITE);
        ResetEvent(startCalculating)

        //[CALCULATION]
        //gen->mv_transferSize ---> it does not fail, but is always zero
        //all variables accessed via the gen-pointer are 0

        setEvent(stoppedCalculaing)
    }
}

Ответы [ 2 ]

2 голосов
/ 13 мая 2010

Возможно, вы делаете что-то вроде этого:

Rtss_GenSize someFunc()
{
   Rtss_GenSize temp;
   return temp;
}

Rtss_GenSine mygensize = some_func();

В этом случае конструктор вызывается один раз, во временном экземпляре конструктор копирования вызывается для копирования его в mygensize (дважды), что делает «this» бесполезным для потока, который был создан.

В этом может быть проблема ... код, который создает экземпляр Rtss_GenSine, поможет расследованию, если вы опубликуете его ...

0 голосов
/ 16 мая 2010

Вот еще одно предположение - условие гонки, инициализация вашего мьютекса startCalculating, чтобы не быть владельцем, и mv_transferSize инициализируется после конструктора, но до вызова getNextData ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...