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

相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
未济3 天前
linux 配置环境变量
linux
傲世仙尊3 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
m0_547486663 天前
《数据结构教程》全套 PPT课件2026
数据结构
_艾伦 耶格尔.3 天前
进程间通信
linux
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
Liuqy-053 天前
Linux IO编程——静态库、动态库
linux