Использование boost::thread_specific_ptr в потоке без ускорения

Я читаю раздел документации для boost::thread_specific_ptr, и пытаемся разобрать этот абзац:

Примечание. На некоторых платформах очистка данных, относящихся к потоку, не выполняется для потоков, созданных с помощью собственного API платформы. На этих платформах такая очистка выполняется только для потоков, запущенных с помощью boost::thread, если только boost::on_thread_exit() не вызывается вручную из этого потока.

Во-первых, это, вероятно, педантичный момент: я предполагаю, что они хотели сказать boost::this_thread::at_thread_exit(), а не boost::on_thread_exit(). В противном случае я действительно потерян.

Что еще более важно, что именно должен делать поток? Достаточно ли передать в at_thread_exit() какую-то неработающую функцию или нужно передать что-то еще?

(Эта тема обсуждалась в комментариях здесь, но я все еще не уверен, что мне нужно делать.)

(Предыстория: я ищу решение проблемы, которую поднял ранее сегодня).


person slyqualin    schedule 17.03.2014    source источник


Ответы (2)


После еще нескольких копаний кажется, что загадочный абзац действительно имел в виду on_thread_exit(). Это имело в виду недокументированную функцию, которая не принимает аргументов.

Вот объявление этой функции и сопровождающий комментарий из booston_thread_exit()55_0/boost/thread/detail/tss_hooks.hpp:

BOOST_THREAD_DECL void __cdecl on_thread_exit(void);
    //Function to be called just be fore a thread ends
        //in an exe or dll that uses Boost.Threads.
    //Must be called in the context of the thread
        //that is ending.
    //Called automatically by Boost.Threads when
        //a method for doing so has been discovered.
    //Must not be omitted; may be called multiple times.

Итак, iiuc, мне нужно написать код для конкретной платформы, который будет запускать вызов этой функции всякий раз, когда поток любого типа завершается, если этот поток использует boost::thread_specific_ptr.

person slyqualin    schedule 18.03.2014
comment
Обратите внимание, что это доступно только в Windows. - person jupp0r; 21.12.2017

Когда поток завершается, он должен уничтожить свои значения указателей, специфичных для потока. В системах POSIX это делается с помощью функции деструктора, зарегистрированной при создании ключа для конкретного потока, см. http://pubs.opengroup.org/onlinepubs/007904975/functions/pthread_key_create.html, то есть этот комментарий не относится к системам POSIX.

Этот комментарий, вероятно, относится к Windows, где также требуется ссылка на версию общей библиотеки boost::thread, иначе указатели для конкретных потоков не будут уничтожены.

person Maxim Egorushkin    schedule 17.03.2014
comment
Извините, если я медленно, но я еще не вижу, что мне нужно сделать. Мой код (надеюсь) будет работать на разных системах, на некоторых posix, на некоторых нет, и я надеялся, что boost позволит мне написать что-то, что не будет зависеть от этого. Реальна ли эта надежда? Цитата из документа boost, кажется, предполагает, что я могу решить ее на уровне вызовов API boost. - person slyqualin; 17.03.2014
comment
@slyqualin Вам не нужно делать ничего особенного, если вы используете boost::thread для создания новых тем. Я предлагаю потратить некоторое время на чтение документации. - person Maxim Egorushkin; 17.03.2014
comment
Я не знаю, какой механизм собираются использовать мои пользователи для создания своих потоков. Вот почему меня интересует, как boost::thread_specific_ptr ведет себя с потоками, созданными с помощью собственного API платформы (т. е. с любыми потоками). К сожалению, единственная найденная мной документация, имеющая отношение к этому вопросу, — это загадочный абзац, который я процитировал в начале. - person slyqualin; 17.03.2014