C++11用两个线程轮流打印整数的实现方法

 更新时间:2020年09月10日 10:57:50   作者:Augusdi  
这篇文章主要介绍了C++11用两个线程轮流打印整数的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

使用C++11标准的的线程语法,用两个线程轮流打印整数,一个线程打印奇数,一个线程打印偶数。可以练习线程的基本操作、线程锁和条件变量等技术。完整代码如下。代码后面附有主要语句的讲解。

#include <thread>
#include <iostream>
#include <mutex>
#include <condition_variable>
 
std::mutex data_mutex;
std::condition_variable data_var;
bool label = false;
 
void printodd()
{
  std::unique_lock<std::mutex> ulock(data_mutex) ;
  for(int odd = 1; odd <= 100; odd += 2 )
  {
    data_var.wait(ulock,[]{return label;});
    std::cout<< std::this_thread::get_id() << ": " << odd <<std::endl;
    label = false;
    data_var.notify_one();
  }
}
 
void printeven()
{
  std::unique_lock<std::mutex> ulock(data_mutex) ;
  for(int even = 0; even < 100; even += 2 )
  {
    std::cout<< std::this_thread::get_id() << ": " << even <<std::endl;
    data_var.notify_one();
    label = true;
    data_var.wait(ulock,[]{return !label;});
  }
}
 
int main()
{
  std::thread t1(printeven);
  std::thread t2(printodd);
  t1.join();
  t2.join();
  std::cout<<"end!"<<std::endl;
  return 0;
}

程序中使用std::unique_lock<std::mutex> ulock(data_mutex)来管理互斥量,

这是一个RAII的资源管理方式,在ulock析构的时候,会自动释放data_mutex。

std::condition_variable提供了两种 wait() 函数。当前线程调用 wait() 后将被阻塞,此时当前线程应该获得了锁(也就是互斥量data_mutex),直到另外某个线程调用 notify_* 唤醒了当前线程。

在线程被阻塞时,该函数会自动调用 data_mutex.unlock() 释放锁,使得其他被阻塞在锁竞争上的线程得以继续执行。另外,一旦当前线程获得通知(notified,通常是另外某个线程调用 notify_* 唤醒了当前线程),wait()函数也是自动调用data_mutex.lock(),使得data_mutex的状态和 wait 函数被调用时相同。

在第二种情况下(即设置了前提条件),只有当前提条件为false时调用 wait() 才会阻塞当前线程,并且在收到其他线程的通知后只有当前提条件为true 时才会被解除阻塞。

总结

到此这篇关于C++11用两个线程轮流打印整数的实现方法的文章就介绍到这了,更多相关C++11线程打印整数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 用C语言进行最基本的socket编程

    用C语言进行最基本的socket编程

    这篇文章主要介绍了C语言下socket编程的基本知识讲解,包括最基本的客户端发送及服务器端接受数据的实现,需要的朋友可以参考下
    2015-11-11
  • C语言如何实现翻转字符串中的单词

    C语言如何实现翻转字符串中的单词

    这篇文章主要介绍了C语言如何实现翻转字符串中的单词,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 一文带你分清C++的定义,声明和初始化

    一文带你分清C++的定义,声明和初始化

    这篇文章主要为大家详细介绍了C++的定义,声明,初始化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++实现二分法求方程近似解

    C++实现二分法求方程近似解

    这篇文章主要为大家详细介绍了C++实现二分法求方程近似解,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++内存管理之简易内存池的实现

    C++内存管理之简易内存池的实现

    大家好,本篇文章主要讲的是C++内存管理之简易内存池的实现,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2021-12-12
  • C++中try throw catch异常处理的用法示例

    C++中try throw catch异常处理的用法示例

    这篇文章主要给大家介绍了关于C++中try throw catch异常处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • C语言 柔性数组的使用详解

    C语言 柔性数组的使用详解

    柔性数组(Flexible Array)是引入的一个新特性,它允许你在定义结构体时创建一个空数组,而这个数组的大小可以在程序运行的过程中根据你的需求进行更改特别注意的一点是:这个空数组必须声明为结构体的最后一个成员,并且还要求这样的结构体至少包含一个其他类型的成员
    2022-03-03
  • 浅析C++ atomic 和 memory ordering

    浅析C++ atomic 和 memory ordering

    这篇文章主要介绍了C++ atomic 和 memory ordering的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C++基础入门教程(三):数组、字符串、结构体、共用体

    C++基础入门教程(三):数组、字符串、结构体、共用体

    这篇文章主要介绍了C++基础入门教程(三):数组、字符串、结构体、共用体,需要的朋友可以参考下
    2014-11-11
  • VC++ 使用 _access函数判断文件或文件夹是否存在

    VC++ 使用 _access函数判断文件或文件夹是否存在

    这篇文章主要介绍了VC++ 使用 _access函数判断文件或文件夹是否存在的相关资料,需要的朋友可以参考下
    2015-10-10

最新评论