Порядок уничтожения основного потока и использование pthread_key_create - PullRequest
4 голосов
/ 15 июня 2011

Мне было интересно использовать pthread_key_create при передаче функции деструктора.

Я хотел что-то вроде этого:

static ComplexObject foo;

void workoncomplex(void *) {
    foo.dosomestuff();
}

static pthread_key_t pthreadkey;

void function_called_by_threads() {
    pthread_key_create(&pthreadkey, workoncomplex)
}

Очевидно, я пропустил довольно много деталей.

Для любого потока, который не является основным потоком, это, очевидно, хорошо (при условии блокировки и т. Д.), И всякий раз, когда поток умирает, вызывается моя функция workoncomplex, которая манипулирует объектом foo.

Мой вопрос: действительно ли это для основного потока, поскольку, очевидно, вызов pthreadkey деструктора происходит при уменьшении потока, но гарантированно ли он будет запущен до разрушения статики? Если да, должен ли я проверить, нахожусь ли я в главном потоке, и сразу же вернуться? Или я могу просто обработать все потоки одинаково и предположить, что мои статические объекты все еще будут вокруг.

1 Ответ

2 голосов
/ 15 июня 2011

Функция деструктора не вызывается при выходе из приложения.Он вызывается только при выходе из потока.

Если вы выйдете из основного потока с помощью pthread_exit(), будет вызвана функция деструктора, но приложение еще не закрыто, поэтому безопасно использовать переменные static.

Если вы вызываете exit() или возвращаетесь из main(), то функция деструктора вызываться не будет, поэтому тот факт, что переменные static уничтожены, не является проблемой.Используйте atexit(), чтобы гарантировать, что ваша функция деструктора вызывается при возврате из main() или при вызове exit().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...