栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++线程之 创建多个线程

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++线程之 创建多个线程

创建多个线程案例
void myprint(int inum)
{
    cout << "myprint start" << inum<< endl;
    return;
}

int main()
{
    //创建和等待多个线程
    vector mythreads;

    for (int i = 0; i < 10; i++)
    {
        mythreads.push_back(thread(myprint,i));
    }

    for (auto iter = mythreads.begin(); iter != mythreads.end(); iter++)
    {
        iter->join();
    }

    return 0;
}
多个线程读数据
vector g_v = {1,2,3};//共享数据,只读

void myprint(int inum)
{
    cout << "id为: " << this_thread::get_id()<< "打印的g_v值" << g_v[0] << g_v[1] << g_v[2] << endl;
    return;
}

int main()
{
    //创建和等待多个线程
    vector mythreads;

    for (int i = 0; i < 10; i++)
    {
        mythreads.push_back(thread(myprint,i));
    }

    for (auto iter = mythreads.begin(); iter != mythreads.end(); iter++)
    {
        iter->join();
    }

    return 0;
}

多线程有读有写

访问共享数据的时候,如果写一半,然后读线程访问共享数据是不是就会异常,所以在访问共享数据的时候,会共享数据的访问进行锁 保护起来
一个c++解决多线程保护共享数据问题的一个概念 “互斥量”

#include 
#include 
#include 
#include 
#include 

using namespace std;

class A {
public:
    //把收到的消息(玩家命令)  入到一个队列的线程
    void inMsgRecvQueue()
    {
        for (int i = 0; i < 10000; i++) {
                cout << "inMsgRecvQueue执行,插入一个元素" << i << endl;
                msgRecvQueue.push_back(i);//假设这个数字就是收到的命令
        }
    }

    void outMsgRecvQueue()
    {
        for (int i = 0; i < 10000; i++)
        {
            if (!msgRecvQueue.empty()) {
                int command = msgRecvQueue.front();//读头部元素
                msgRecvQueue.pop_front();//移除头部元素
                //处理数据
                cout << "接收到命令,处理命令" << command << endl;

            }
            else
            {
                cout << "outMsgRecvQueue执行,但目前消息队列为空" << i << endl;
            }
        }
    
    }
private:
    list msgRecvQueue; //容器,专门用于代表玩家给咱们发送过来的命令
};




int main()
{


    //数据共享问题分析
    //只读的数据:安全稳定,不需要特别说明处理手段,直接读就可以
    //有读有写:2个写线程、8个读线程,如果代码没有特别的处理,那程序肯定崩溃
    //最简单的不崩溃处理,读的时候不能写,写的时候不能读,2 个线程不能同时写,8个线程不能同时读

    //共享数据的保护案例代码
    //网络游戏服务器:两个自己创建的线程,一个线程收集玩家命令,并把命令数据写到一个队列中
    //另一个线程从队列中取出玩家发送过来的命令,解析,然后执行
    //list频繁的按顺序插入数据和删除数据效率高
    //vector容器随机的插入和删除数据效率高
    //所以队列使用list

    A mya;
    thread Rthread(&A::outMsgRecvQueue,&mya);//第二个参数,带引用,就不会被拷贝一分了,这个就不能用detach了
    thread Wthread(&A::inMsgRecvQueue, &mya);
    Rthread.join();
    Wthread.join();

    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1005117.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号