Вызов функции при завершении потока в PThreads или Windows

Я создаю библиотеку 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 _будет работать для других случаев и может быть решением, но я бы хотел лучшее, если это возможно.

Если у кого-нибудь есть какие-нибудь идеи о том, как я мог бы это сделать, это было бы здорово!

5
задан Dave McGinnis 30 April 2012 в 21:53
поделиться