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线程打印整数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++11/14 线程中使用Lambda函数的方法

    多线程中使用lambda 在本篇文章中,主要介绍lambda函数在多线程中的使用. 先从下面的例子开始吧: #include <iostream> #include <thread> int main() { std::thread t([]() { std::cout << "thread function\n"; }); std::cout << "main thread\n"; t.join(); return

  • C++11并发编程:多线程std::thread

    一:概述 C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改.现在在C++11中只需使用语言层面的thread可以解决这个问题. 所需头文件<thread> 二:构造函数 1.默认构造函数 thread() noexcept 一个空的std::thread执行对象 2.初始化构造函数 template<class Fn, class... Args> explicit th

  • C++11/14 线程调用类对象和线程传参的方法

    线程调用类对象 在前面的示例中,我们为线程任务使用了通常的函数.实际上,我们可以使用任何可调用对象或者lambda函数,如下调用类对象的例子: #include <iostream> #include <thread> class MyFunctor { public: void operator()() { std::cout << "functor\n"; } }; int main() { MyFunctor fnctor; std::thre

  • 基于C++11的threadpool线程池(简洁且可以带任意多的参数)

    C++11 加入了线程库,从此告别了标准库不支持并发的历史.然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池.信号量等.线程池(thread pool)这个东西,在面试上多次被问到,一般的回答都是:"管理一个任务队列,一个线程队列,然后每次取一个任务分配给一个线程去做,循环往复." 貌似没有问题吧.但是写起程序来的时候就出问题了. 废话不多说,先上实现,然后再啰嗦.(dont talk, show me ur code !) 代码实现 #pra

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

    使用C++11标准的的线程语法,用两个线程轮流打印整数,一个线程打印奇数,一个线程打印偶数.可以练习线程的基本操作.线程锁和条件变量等技术.完整代码如下.代码后面附有主要语句的讲解. #include <thread> #include <iostream> #include <mutex> #include <condition_variable> std::mutex data_mutex; std::condition_variable data_va

  • java实现两个线程交替打印的实例代码

    使用ReentrantLock实现两个线程交替打印 实现字母在前数字在后 package com.study.pattern; import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public c

  • Java 用两个线程交替打印数字和字母

    前一段时间听马士兵老师讲课,讲到某公司的一个面试,两个线程,其中一个线程输出ABC,另一个线程输出123,如何控制两个线程交叉输出1A2B3C,由于本人多线程掌握的一直不是很好,所以听完这道题,个人感觉收获良多,这是一个学习笔记.这道题有多种解法,不过有些属于纯炫技,所以只记录常见的三种解法.首先看第一种 1. park 和 unpark package cn.bridgeli.demo;   import com.google.common.collect.Lists;   import ja

  • C++详解如何实现两个线程交替打印

    C++线程库,点击此处查看文档 首先简单搭一个框架,让两个线程先尝试实现交替打印. //实现两个线程交替打印 #include <iostream> #include <thread> using namespace std; int main(void) { int n = 100; int i = 0; //创建两个线程 thread t1([&n, &i](){ while (i < n) { cout << i << "

  • Java实现多线程轮流打印1-100的数字操作

    首先打印1-100数字如果用一个单线程实现那么只要一个for循环即可,那么如果要用两个线程打印出来呢?(一个线程打印奇数,一个线程打印偶数)于是大家会想到可以通过加锁实现,但是这样的效率是不是不高?这里我用一个变量来控制两个线程的输出 public class ThreadTest { volatile int flag=0; public void runThread() throws InterruptedException{ Thread t1=new Thread(new Thread1

  • python 实现两个线程交替执行

    我就废话不多说,直接看代码吧! import threading import time def a(): while True: lockb.acquire() print('a') locka.release() time.sleep(0.5) def b(): while True: locka.acquire() print('b') lockb.release() time.sleep(0.5) if __name__ == "__main__": locka = threa

  • golang 两个go程轮流打印一个切片的实现

    问题描述: 两个 go 程轮流打印一个切片. Golang 实现: 使用两个 channel,只用来判断 package main import ( "fmt" "sync" ) // 两个 go 程轮流打印一个切片 func main() { ch1 := make(chan bool, 1) ch2 := make(chan bool, 1) ch1 <- true nums := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} var

  • Java线程使用同步锁交替执行打印奇数偶数的方法

    对同一个对象进行多线程操作时,如何保证线程执行结果的一致性?我们需要对线程操作对象加同步锁.(这是一道面试题) 需求描述 1-20个数字 A线程打印奇数:1,3,5,7,9,11,13,15,17,19 B线程打印偶数:2,4,6,8,10,12,14,16,18,20 C线程在AB两个线程执行完了之后打印结果:"success". 线程代码实现 Num.java package com.boonya.thread.test; /** * @ClassName: Num * @Desc

  • Java实现的两个线程同时运行案例

    本文实例讲述了Java实现的两个线程同时运行.分享给大家供大家参考,具体如下: /** * 两个案例同时运行案例 * 1:这个两个线程并不是有规律的运行而是有没有规律的交替运行 */ package com.test3; public class Demo10_3 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Pig pig=new Pig(10

  • Java中实现两个线程交替运行的方法

    今天笔者收到老师的一个题目,让我准备两个流程,依次实现输出以下信息 如: 线程A 打印 字母a ,线程B 打印数字1 线程A 打印 字母b ,线程B 打印数字2 线程A 打印 字母c ,线程B 打印数字3 线程A 打印 字母d ,线程B 打印数字4 ... 依次打印完毕26个字母和26个数字 ,输出效果为: a1b2c3...z26 下文笔者就将具体的实现思路展示如下: 1.将借助多线程的wait方法 2.借助一个外部变量 package com.java265.other; public cl

随机推荐