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

相关推荐
Tairitsu_H37 分钟前
[LC优选算法#17] 链表 | 合并 K 个升序链表 | K个⼀组翻转链表
数据结构·算法·链表
_olone40 分钟前
Luogu P2704 [NOI2001] 炮兵阵地
c++·算法·状压dp
艾莉丝努力练剑1 小时前
OpenCode AI 编程:Ubuntu 24.04 环境安装与使用指南
linux·服务器·网络·人工智能·tcp/ip·ubuntu
崇山峻岭之间1 小时前
Keil5输出hex转换为bin的设置
linux·运维·服务器
kebidaixu1 小时前
两轮BMS 防打火策略详解
算法
谷雪_6582 小时前
Linux 网络命名空间:从内核原理到企业级容器网络架构全景实战
linux·网络·架构
wabs6662 小时前
关于动态规划【力扣1035.不相交的线和53.最大子数组和的思考】
算法·leetcode·动态规划
退休倒计时2 小时前
【每日一题】LeetCode 199. 二叉树的右视图 TypeScript
算法·leetcode·typescript
可编程芯片开发2 小时前
通过MATLAB实现PID控制器,积分分离控制器以及滑模控制器
算法
kebidaixu3 小时前
两轮BMS 短路保护策略详解
算法