Я создаю библиотеку C++ как для Linux (с PThreads ), так и для Windows (со встроенными -в WinThreads ), который может быть присоединен к любой программе и должен иметь функцию, вызываемую при выходе из потока, аналогично тому, как atexit работает для процессов.
Я знаю pthread _cleanup _push и pthread _cleanup _pop для pthreads, но они не работают для меня, так как это макросы, которые добавляют другую лексическую область видимости, тогда как я хочу объявить эту функцию при первом вызове моей библиотеки, а затем разрешить самой программе запускать свой собственный код, как это необходимо. Я не нашел ничего подобного в Windows вообще.
Обратите внимание, что это не означает, что я хочу, чтобы внешний поток был предупрежден, когда поток останавливается, или даже что я могу изменить способ выхода из потока, поскольку это контролируется самой программой, моя библиотека просто прилагается, вместе для езды.
Таким образом, возникает вопрос:Как лучше всего в данном случае заставить функцию, которую я написал, вызываться при закрытии потока в Windows или Linux, когда я не могу контролировать, как поток создан или уничтожен?
Например, в основной программе:
void* threadFunc(void* arg)
{
printf("Hello world!\n");
return NULL;
}
int main(int argc, char** argv)
{
int numThreads = 1;
pid_t* pids = NULL;
pids = (pid_t*) calloc(sizeof(pid_t), numThreads);
pthread_create(&ntid, NULL, threadFunc, &nVal);
pthreads[0] = ntid;
pthread_join(pthreads[0], NULL);
return 0;
}
В библиотеке:
void callMeOnExit()
{
printf("Exiting Thread!\n");
}
Я бы хотел, чтобы callMeOnExit вызывался, когда поток достигает return NULL; в этом случае, а также когда основной поток достигает возврата 0;. Обертывание выхода из pthread _будет работать для других случаев и может быть решением, но я бы хотел лучшее, если это возможно.
Если у кого-нибудь есть какие-нибудь идеи о том, как я мог бы это сделать, это было бы здорово!