LINUX.ORG.RU

[C++][boost::thread] Создать поток в замороженном состоянии

 


0

1

Собссно, subj. Читая документацию по boost::thread понимаю, что при создании экземпляра потока с передачей ему функции в конструктор, он сразу начнёт её исполнять. Мне это поведение слегка неудобно. Надо отложить запуск функции до заданной точки выполнения. Пока единственное, что придумалось, выглядит вот так:

#include <boost/thread/thread.hpp>
//-----------------------------------------------------
void thread_function(void)
{
 // Что-то делаем
 return;
}
//-----------------------------------------------------

class class_name
{
private:
 boost::thread th;
public:
 class_name(void)
 {
  // Здесь что-то выполняется до запуска потока
  th=boost::thread(thread_function); // Здесь должен стартовать поток
  // Может быть, что-то ещё надо сделать
  return;
 }
};

Решение так себе получается, не очень красиво. У потоков системы (что Linux, что Windows) есть параметр «создать спящим». Но в boost::thread я такого не нашёл. Или я неправильно понимаю вообще задумку boost-овских потоков? Кто что посоветует?

Заснуть на условии при старте.

LamerOk ★★★★★
()

>У потоков системы (что Linux, что Windows) есть параметр «создать спящим».

Где ты нашел такое в pthread? Единственное переносимое решение — создавать еще и мьютекс, который лочится в основном потоке перед запуском треда, а в дочернем потоке сначала лочится, затем анлочится и уничтожается.

linuxfan
()

kiss

#include <boost/thread/thread.hpp> 
//----------------------------------------------------- 
void thread_function(void) 
{ 
 // Что-то делаем 
 return; 
} 
//----------------------------------------------------- 
 
class class_name 
{ 
private: 
 std::auto_ptr<boost::thread> th; // kiss
public: 
 class_name(void) 
 { 
  // Здесь что-то выполняется до запуска потока 
  th.reset(new boost::thread(thread_function)); // стартуем поток
  // Может быть, что-то ещё надо сделать 
  return; 
 } 
}; 
peacelove
()
Ответ на: комментарий от Deleted

> Использовать condition variable в самом начале кода потока

Попробую поиграться с ними, спасибо.

one_more_hokum ★★★
() автор топика
Ответ на: kiss от peacelove
private:  
 std::auto_ptr<boost::thread> th;

А нафея? Он у меня, ведь, всё равно на стеке создавался.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

простите, но что именно нафея? у вас ограничения на количество вызовов new/delete в программе?

peacelove
()
Ответ на: комментарий от one_more_hokum

обращаю внимание, что изменено две строчки исходного кода. вторая это:

 
th.reset(new boost::thread(thread_function)); // стартуем поток  

теперь менее нафея?

peacelove
()
Ответ на: комментарий от peacelove

> но что именно нафея?

Ну, если можно создать экземпляр на стеке — зачем его в автоуказатель оборачивать?

Я ничего не имею против автоуказателей, более того — всеми руками и ногами за них, но в данном случае, думается мне, он будет избыточен.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

создаётся не на стеке чтобы запустить поток тогда когда нужно, и не заниматься банальными извращениями с condition var's

peacelove
()
Ответ на: комментарий от peacelove

Так а

th=boost::thread(thread_function);
чем хуже?

Опять же, condition_variable придётся пихать внутрь функции потока хотя бы для того, чтоб его корректно остановить, когда нужно.

one_more_hokum ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.