У меня есть один поток (Поток A) в статической библиотеке C, который создает libevent event_base
после выполнения этого:
#ifdef WIN32
evthread_use_windows_threads();
#else
evthread_use_pthreads();
#endif
Эта статическая библиотека C является однопоточной и выполняет все libeventСама работа: добавление событий, диспетчеризация, основной цикл и т. д., все это делается из потока A.
Теперь у меня есть программа на C ++, которую я связываю с библиотекой выше, вызывающей функцию входа в библиотеку C изboost::thread
, называемый потоком B.
В какой-то момент в моей программе на C ++ у меня есть еще один boost::thread
, называемый потоком C, который попытается event_add
использовать библиотеку C в цикле событий потока A, а затемнемедленно позвоните event_active
.
Что бы я хотел увидеть после выполнения материала из темы C, это:
calling event_add from Thread C
calling event_active from Thread C
Processing events from Thread A
calling the event's handler from Thread A
Возможно, мы могли бы иметь Processing events from Thread A
где-нибудь еще между этими строками,но наверняка у нас должна быть хотя бы 1 такая строка между event_active
и event handler execution
, верно?
Вместо этого я вижу следующее:
calling event_add from Thread X
calling event_active from Thread X
calling the event's handler from Thread A
Поток X - это другой идентификаторчем нить с но я догадываюсьss, это только из-за использования потоков наддува на вызывающем сайте C ++ и pthreads в библиотеке C или что-то еще, в любом случае это меня не беспокоит.
Мне также нравится тот факт, что моя основная цель здесь в порядке: запусксобытие из потока и обработка его из другого.
Но для моего собственного любопытства я не понимаю, почему я не вижу строки "обработка событий из потока A" до вызова обратного вызова обработчика?
Идентификаторы потоков были получены с pthread_self()
, это было проверено на Linux, более конкретно на Ubuntu 18.04.