Порядок уничтожения основного потока и использование pthread_key_create
Мне было интересно об использовании 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 ответ
Функция деструктора не вызывается при выходе из приложения. Он вызывается только при выходе из потока.
Если вы выходите из основного потока с pthread_exit()
тогда будет вызвана функция деструктора, но приложение еще не закрыто, поэтому безопасно использовать static
переменные.
Если вы позвоните exit()
или вернуться из main()
функция деструктора вызываться не будет, поэтому тот факт, что static
Переменные уничтожаются не проблема. использование atexit()
чтобы убедиться, что ваша функция деструктора вызывается по возвращении из main()
или по вызову exit()
,