Порядок уничтожения основного потока и использование 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(),

Другие вопросы по тегам