C++11 学习笔记(7) 线程与信号

C++11 stl里推出了线程操作相关的库(根据平台特性使用对应的线程库, eg: pthread in posix):
std::thread
std::condition_variable 条件变量(信号量)
std::mutex 互斥量

现在结合以上提到库以及 std::signal 完成一个小例子:
  1. 定义一个全局工作类, 带有线程成员, 以及线程执行的函数, 在线程函数中定时(chrono库)输出时间.
  2. main thread 中调用 std::signal 注册接收 SIGINT SIGTERM SIGABRT 信号(目的是接收中断信号, 跳出 main thread while true 的loop 循环)
  3. 工作线程开始运行
  4. main thread 在线程创建后进入 while true loop 同样定时输出时间
  5. 因为在命令行终端执行该程序, 需要其停止时, Ctrl-C( or Ctrl-Z in Windows) 中断,
    程序的接收到 SIGTERM 信号 signal 处理的单独线程中将全局的 mainRunning 置为 false,
    并且通知工作线程停止 main thread loop 循环在 mainRunning 为 false 后跳出循环
  6. 程序结束

定义了信号量 std::condition_variable cvWaitThreadExit .
调用 Stop 通知线程结束运行时, 线程在结束前,
Stop接口在 cvWaitThreadExit.wait(ulock, [this]{ return threadHasStopped_;});
代码处阻塞 wait 接口替代了 while loop 代码:

工作线程里的 cvWaitThreadExit.notify_one(); 通知后, cvWaitThreadExit.wait 会继续运行.
cvWaitThreadExit 的 wait 接口等价于

代码可以改进的点:
– 工作类 class A 中, threadHasStopped_ 与 running_ 的类型可以定义为:
std::atomic or std::atomic_bool 替代信号量和 mutex,
代码改进在之后的文章里会再次讨论

原创文章,转载请注明: 转载自kaka_ace's blog

本文链接地址: C++11 学习笔记(7) 线程与信号

发表评论

电子邮件地址不会被公开。 必填项已用*标注