Задайте вопрос:
Этот вопрос
Как описано в связанном вопросе, у нас есть API, который использует просмотр событий, который опрашивает select () для обработки пользовательских обратных вызовов.
У меня есть класс, использующий это как:
class example{
public:
example(){
Timer* theTimer1 = Timer::Event::create(timeInterval,&example::FunctionName);
Timer* theTimer2 = Timer::Event::create(timeInterval,&example::FunctionName);
start();
cout<<pthread_self()<<endl;
}
private:
void start(){
while(true){
if(condition)
FunctionName();
sleep(1);
}
}
void FunctionName(){
cout<<pthread_self()<<endl;
//Do stuff
}
};
Идея заключается в том, что вы хотите, чтобы FunctionName вызывалось как в случае выполнения условия, так и при включенном таймере. Не сложная концепция. Что мне интересно, так это если FunctionName будет вызываться как в функции start (), так и при обратном вызове одновременно? Это может привести к некоторому повреждению памяти для меня, так как они получают доступ к не поточно-безопасной части общей памяти.
Мое тестирование говорит мне, что они работают в разных потоках (повреждение только при использовании событий), хотя: cout<<pthread_self()<<endl;
говорит, что они имеют одинаковый идентификатор потока.
Может кто-нибудь объяснить мне, как эти обратные вызовы разветвляются? Какой порядок они получают? В каком потоке они работают? Я предполагаю, что они работают в потоке, который выполняет select (), но когда же они получают тот же идентификатор потока?