почему процедура потока должна быть статической или функцией-членом - PullRequest
3 голосов
/ 08 сентября 2010

почему процедура потока должна быть статической или функцией-членом? Любая уважительная причина?

Ответы [ 3 ]

6 голосов
/ 08 сентября 2010

Нестатические переменные-члены имеют неявный параметр this, передаваемый компилятором внутри.

У вас есть

ClassInQuestion {
   void threadFunc( int );
}

и компилятор внутренне создает функцию

void ClassInQuestion_threadFunc( ClassInQuestion* thisObject, int );

Так, если процедура потока не примет указатель t функцию, которая имеет первый параметр типа ClassInQuestion*, она не будет соответствовать ожидаемой сигнатуре функции.

3 голосов
/ 08 сентября 2010

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

2 голосов
/ 08 сентября 2010

Как правило, процедуры потоков должны вызываться предопределенными функциями в библиотеках потоков с механизмом обратного вызова.Чтобы иметь возможность вызывать функцию-член (не статическую), вам нужен объект класса, который будет вызывать функцию.Однако ни одна из доступных библиотек потоков не поддерживает это, то есть они не принимают объект, который будет использоваться для вызова зарегистрированной функции.Таким образом, все такие функции должны быть статическими и иметь тип, приведенный соответствующим образом.

...