C++新特性(六)多线程(2)线程中互斥量的使用,mutex对象使用,lock_guard类模板,死锁的解决

本文介绍了C++多线程中的互斥量使用,通过mutex对象和lock_guard类模板解决数据共享问题。讨论了死锁的产生、演示及解决方案,包括std::lock方法和lock_guard的进一步应用。
摘要由CSDN通过智能技术生成

一,创建多个线程

前面学习了怎么使用thread类创建一个线程C++新特性(六)多线程(1)线程启动、结束,创建线程、join,detach,线程传参详解
,在实际应用中,我们可以创建多个线程

void TextThread()
{
   
     cout << "我是线程" << this_thread::get_id() << endl;
     /*  …  */
     cout << "线程" << this_thread::get_id() << "执行结束" << endl; 
}
 //main函数里     vector threadagg;
     for (int i = 0; i < 10; ++i)
     {
   
         threadagg.push_back(thread(TextThread));
     }
     for (int i = 0; i < 10; ++i)
     {
   
         threadagg[i].join();
     }

1)把thread对象放入到容器中管理,看起来像个thread对象数组,对一次创建大量的线程并对大量线程进行管理有好处
2)多个线程执行顺序是乱的,跟操作系统内部对线程的运行调度机制有关

2,多个线程之间数据共享的问题

创建以后,这多个线程之间是并发运行的,而这多个线程之间可能访问同一个数据。如果这多个线程对该共享数据都只进行读操作,一定不会发生问题,但是如果有一些线程写共享数据,而另一些线程读共享数据;就很容易发生问题。很可能发生某个进程正在写数据还没写完,线程就切换到另一个要对该共享数据读的线程。程序马上奔溃。例如下面将要演示的一个场景,该场景模拟一个简单的游戏服务器,该服务器中有两个线程,一个线程负责往一个共享队列写玩家命令数据;另一个线程负责从这个共享队列中读取玩家命令并执行。读者可以尝试运行下面命令观察这个现象加深理解。该程序中途一定奔溃。

#include <iostream>
#include <thread>
#include <list>
#include <vector>

using namespace std;

class A {
   
public:
    // 把收到的消息(玩家命令)放入到一个队列
    void inMsgRecvQueue() {
   
        for (int i = 0; i < 100000; ++i) {
   
            cout << "inMsgRecvQueue()执行、插入一个元素" << i << endl;
            msgRecvQueue.push_back(i);
        }
    }
    // 把数据从消息队列中取出的线程
    void outMsgRecvQueue() {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值