【请教】boost::thread线程如何在需要时再执行

tiger波波 2017-02-24 11:38:52
大家好,初学boost,发现线程使用起来有点问题,如下边例子所示:

void fun()
{
while(true)
{
boost::this_thread::interruption_point();
do some...
}
}

void StartThread()
{
boost::thread thrd(&fun);
thrd.join(); 或 thrd.Detach();
}

上边的例子一旦实例化线程类,就马上执行了。
如果使用join,则主线程锁死,跟没用线程一样
如果使用Detach,则失去了对线程的控制

所以能不能让线程在需要时再执行,这样就可以将线程实例作为一个类的成员变量,想启动时启动,想join时join
想中断时中断。
...全文
355 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiger波波 2017-03-01
  • 打赏
  • 举报
回复
现在的办法是:线程指针作为类成员变量。启动时new一个线程实例,线程即开始运行。结束时使用指针调用join。
yshuise 2017-02-24
  • 打赏
  • 举报
回复
根本不用你的方法,而是另外的类
赵4老师 2017-02-24
  • 打赏
  • 举报
回复
《Windows核心编程》
ztenv 版主 2017-02-24
  • 打赏
  • 举报
回复
不需要的时候让线程等
tiger波波 2017-02-24
  • 打赏
  • 举报
回复
引用 3 楼 x20121223 的回复:
线程不要用boost了,c++11自带。wait和notify_one, notify_all就是控制唤醒和挂起线程的函数 #include <iostream> // std::cout #include <thread> // std::thread #include <mutex> // std::mutex, std::unique_lock #include <condition_variable> // std::condition_variable std::mutex mtx; // 全局互斥锁. std::condition_variable cv; // 全局条件变量. bool ready = false; // 全局标志位. void do_print_id(int id) { std::unique_lock <std::mutex> lck(mtx); while (!ready) // 如果标志位不为 true, 则等待... cv.wait(lck); // 当前线程被阻塞, 当全局标志位变为 true 之后, // 线程被唤醒, 继续往下执行打印线程编号id. std::cout << "thread " << id << '\n'; } void go() { std::unique_lock <std::mutex> lck(mtx); ready = true; // 设置全局标志位为 true. cv.notify_all(); // 唤醒所有线程. } int main() { std::thread threads[10]; // spawn 10 threads: for (int i = 0; i < 10; ++i) threads[i] = std::thread(do_print_id, i); std::cout << "10 threads ready to race...\n"; go(); // go! for (auto & th:threads) th.join(); return 0; }
这是用编程的方法实现的,也是实例化就启动,只不过人为的加上挂起而已,跟boost没啥区别啊。 上边的函数boost也有,名字都类似
wersdfadaf 2017-02-24
  • 打赏
  • 举报
回复
线程不要用boost了,c++11自带。wait和notify_one, notify_all就是控制唤醒和挂起线程的函数 #include <iostream> // std::cout #include <thread> // std::thread #include <mutex> // std::mutex, std::unique_lock #include <condition_variable> // std::condition_variable std::mutex mtx; // 全局互斥锁. std::condition_variable cv; // 全局条件变量. bool ready = false; // 全局标志位. void do_print_id(int id) { std::unique_lock <std::mutex> lck(mtx); while (!ready) // 如果标志位不为 true, 则等待... cv.wait(lck); // 当前线程被阻塞, 当全局标志位变为 true 之后, // 线程被唤醒, 继续往下执行打印线程编号id. std::cout << "thread " << id << '\n'; } void go() { std::unique_lock <std::mutex> lck(mtx); ready = true; // 设置全局标志位为 true. cv.notify_all(); // 唤醒所有线程. } int main() { std::thread threads[10]; // spawn 10 threads: for (int i = 0; i < 10; ++i) threads[i] = std::thread(do_print_id, i); std::cout << "10 threads ready to race...\n"; go(); // go! for (auto & th:threads) th.join(); return 0; }

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧