Linux线程同步与互斥

一个程序

cpp 复制代码
#include <iostream>
#include <vector>
#include "Thread.hpp"

int TicketNum = 10000;
void BuyTicket(int num)
{
    while(true)
    {
        if(TicketNum>0)
        {
            std::cout << "get a ticket,number of ticket:" << TicketNum-- << std::endl;
        }
        else
        {
            break;
        }
    }
}
int main()
{
    std::vector<ThreadModule::Thread<int>> vecThreads;
    for(int i = 0;i<10;i++)
    {
        vecThreads.emplace_back(BuyTicket,-1);          //方便演示,模板参数先随便给一个
    }
    for(int i = 0;i<10;i++)
    {
        vecThreads[i].Start();
    }
    for(int i = 0;i<10;i++)
    {
        vecThreads[i].Join();      //注意必须要等待,如果等待的话,主线程一执行完整个进程就直接退出了
    }
    return 0;
}

在上面的程序当中,模拟实现了10个线程抢票的场景,现在来看看运行结果

发现票是居然为负数了,但是我们的判断条件里面明明写了需要票数大于0的时候才执行抢票功能,下面解释一下原因

每一次抢票让票数减去一都会执行这一段汇编指令:先将变量从内存加载到CPU的寄存去中,变量减去之后再将变量写回内存,这样当线程A将值从内存写到寄存器当中判断大于0立马切换到线程B

相关推荐
张欣-男6 小时前
3分钟理解线性代数
线性代数·算法
白狐_7986 小时前
408 数据结构|外部排序优化:怎么减少时间开销
数据结构·算法
小白说大模型6 小时前
Hermes 全配置指南:从裸版到 AI Agent 天花板
大数据·人工智能·学习·算法·机器学习·数据挖掘
zerwave6 小时前
从零实现简化 DDS 完整技术文档(含模块作用与详细注释)
linux·c++·机器人
a187927218316 小时前
【算法】动态规划入门:从打家劫舍到状态设计的三堂课
算法·leetcode·动态规划·dp·回溯·暴力
琥珀色糖15 小时前
Linux守护进程
linux·终端·守护进程·会话·进程组
淡海水16 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan16 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy17 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
乐迪信息17 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉