首页 > 编程语言 >C++多线程编程:包括多线程打印ABC、线程池实现等等

C++多线程编程:包括多线程打印ABC、线程池实现等等

时间:2023-09-08 19:34:15浏览次数:53  
标签:std 多线程 MinGW int C++ ABC mutex print include

#include<iostream>
#include<thread>
#include<mutex>
#include<condition_variable>

std::condition_variable cond;
std::mutex print_mutex;
int flag = 0;

void print_thread(int num)
{
    for (int i = 0; i < 10; i++)  // 循环
    {
        std::unique_lock<std::mutex> lk(print_mutex);
        cond.wait(lk, [&]() {return num == flag; });
        std::cout << char('A' + num);  // 打印ABC,
        flag = (flag + 1) % 3;
        cond.notify_all();
    }
}

int main()
{
    std::thread t1(print_thread, 1);
    std::thread t2(print_thread, 2);
    print_thread(0);
    t1.join();
    t2.join();
}

这段代码在跨平台时会报错,因为安装的MinGW没有选用支持POSIX的版本。

这是因为MinGW没有thread类,对于跨平台的线程实现,GCC标准库似乎依赖于gthreads/pthreads库。如果这个库不可用,就像MinGW一样,std::thread、std::mutex、std::condition_variable类不会被定义。然而,各种可用的helper类仍然定义在系统头文件中。因此,这个实现没有重新定义它们,而是包含了这些头文件。
解决方案:换成pthread或者        https://github.com/meganz/mingw-std-threads

https://github.com/meganz/mingw-std-threads

在github上能够找到MinGW-std-threads,这个文件中包含MinGW.mutx.h, MinGW .thread.h文件并把它们放到全局MinGW目录下就可以修复了这个问题。

 将这几个文件放到MinGW的安装路径:mingw64\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++

我的电脑上是在F:\x86_64-8.1.0-release-win32-seh-rt_v6-rev0\mingw64\lib\gcc\x86_64-w64-mingw32\8.1.0\include\C++

观察这个代码和上面的代码,修改的地方时需要将头文件#include<thread> 改为 # include<mingw.thread.h>

#include<iostream>
#include <mingw.thread.h>
#include <mingw.mutex.h>
#include <mingw.condition_variable.h>

std::condition_variable cond;
std::mutex print_mutex;

int flag = 0;

void print_thread(int num)
{
    for (int i = 0; i < 10; i++)  // 循环
    {
        std::unique_lock<std::mutex> lk(print_mutex);
     //捕获列表只用于非静态局部变量,Lambda可以直接使用静态局部变量和在函数之外声明的名字(全局变量)。 cond.wait(lk, [&]() {return num == flag; }); std::cout << char('A' + num); // 打印ABC, flag = (flag + 1) % 3; cond.notify_all(); } } int main() { std::mutex print_mutex; std::thread t1(print_thread, 1); std::thread t2(print_thread, 2); print_thread(0); t1.join(); t2.join(); }

其他全正常的。

 使用switch case的写法,在ABC之间切换,需要使用flag作为基准唤醒某一个。

可是这样的循环打印有什么意义呢?任务不是派发的。

#include<iostream>
#include <mingw.thread.h>
#include <mingw.mutex.h>
#include <mingw.condition_variable.h>

std::condition_variable cond;
std::mutex print_mutex;

int flag = 0;

void print_thread(int num)
{
    for (int i = 0; i < 10; i++)  // 循环
    {    
        //unique_lock 在超出作用域后会析构,从而自动解锁
        std::unique_lock<std::mutex> lk(print_mutex);
        //condition_variable::wait     true立即返回 false阻塞线程,等待期间会释放这个锁
        //捕获列表只用于非静态局部变量,Lambda可以直接使用静态局部变量和在函数之外声明的名字(全局变量)。
        cond.wait(lk, [&num]() {return num == flag; });
        switch(num){
            case 0: flag = 1; std::cout << "A" << std::endl; break;
            case 1: flag = 2; std::cout << "B" << std::endl; break;
            case 2: flag = 0; std::cout << "C" << std::endl; break;
        }

        //'A'+num 可是num只会为1或者2,为1时打印B 为2时打印C,0是在主线程里打印,那是不是也可以开三个线程。
        //std::cout << char('A' + num);  // 打印ABC,
        //flag = (flag + 1) % 3;
        cond.notify_all();
    }
}

int main()
{   
    std::thread t1(print_thread, 1);
    std::thread t2(print_thread, 2);
    std::thread t0(print_thread, 0);
    //print_thread(0);
    t1.join();
    t2.join();
    t0.join();
    //Sleep(10);
}

 

标签:std,多线程,MinGW,int,C++,ABC,mutex,print,include
From: https://www.cnblogs.com/synapse331/p/17659902.html

相关文章

  • 【230908-16】▲ABC中,a=2,c=二倍根号2,C=45°,则S△ABC=?
    ......
  • 【230908-17】▲ABC中,b=2,B=30°,C=45°,则S△ABC=?(2013年全国II卷)
    ......
  • C++之进化后的 const 分析
    @TOC前言从C演变而来的C++是一种功能更为丰富和面向对象的编程语言。在C++中,const关键字用于表示常量,其用法与C中的const有了一些进化和扩展。本文将探讨C到C++的const的进化,以及在C++中使用const的一些特性和用法。C语言中的constconst修饰的变量是只读的,本质上还是变量。const修......
  • 所以说,java的“方法”有点儿类似于C++的"函数"吧
    两个语言的区别就是,C++如果函数写在下面的话,要在上面注释:而java的方法若写在下面的话,要加static,然后不管怎样,前面一定要加public......
  • C++开发认证
    练习B如果在try块中用throw"error";语句抛出一个异常,则参数类型是()的catch块能够捕获这个异常:(3.0分)Aint*Bconstchar*CcharDconstint2.D关于类模板的模板参数说法正确的是:(3.0分)A只可作为数据成员的类型B只可作为成员函数的返回值类型C只可......
  • mupdf实用操作demo,C++操作PDF文件
    前文:最近有个项目,需要读写PDF,本来想着挺简单的,读写PDF有那么多的库可以使用,唰唰的就完成了。忘记了我写C++的,还是在国产系统上开发的。所以一般的东西还不好使,因为项目需要在多个架构的电脑上使用,所以必须要开源,还要支持读写才行。 找了很多个PDF库(libharu、mupdf、pdfium、......
  • C++系列十:MFC
    目录前言:Helloworld:前言:仅是简单了解,运行,看看是啥。环境:Helloworld:......
  • linux c++ tcp
    1.TCP/IP协议栈链路层:负责下图所示物理链接标准IP层(网络层):选择合适的路径传输数据,无法解决数据传输错误问题,所以需要TCP/UDP协议作为保障TCP/UDP(传输层):IP层(网络层)解决传输路径问题,确定了路径,就进行传输数据,IP层只关注一个数据包如何进行传输,至于传输过程数据包是否损坏,传输......
  • C++ 归并排序
    #include<iostream>#include<vector>usingnamespacestd;///合并voidmerge(vector<int>&nums,intl1,intr1,intl2,intr2,vector<int>&tmp){ intleft=l1,right=r2;intk=l1;while(l1<=r1&&......
  • Androidstudio现有文件中添加C、C++文件 (NDK)
    创建新的C/C++源代码文件1.如果应用的主源代码集内还没有cpp/目录,请按如下所示的方法创建一个:1.1打开AndroidStudio左侧的Project窗格,然后从菜单中选择Project视图。1.2依次选择your-module>src。1.3右键点击main目录,然后依次选择New>Dire......