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

相关推荐
啦啦啦啦啦zzzz22 分钟前
算法:贪心算法
c++·算法·leetcode·贪心算法
一叶龙洲1 小时前
向日葵远程Ubuntu,支持隐私屏
linux·运维·ubuntu
日拱一卒——功不唐捐1 小时前
红黑树删除(C语言)
c语言·数据结构
清泓y2 小时前
RAG 技术
算法·ai
不如语冰2 小时前
AI大模型入门-Python进阶-上下文管理与with语句
开发语言·数据结构·数据库·人工智能·pytorch·redis·python
阿慧今天瘦了嘛2 小时前
计算机组成原理概述:从硬件到软件的桥梁
计算机网络·算法
寒水馨2 小时前
Linux下载、安装llama.cpp-b10068(附安装包llama-b10068-bin-ubuntu-vulkan-x64.tar.gz)
linux·ubuntu·llm·llama·本地部署·llama.cpp·推理引擎
Angle.寻梦3 小时前
数据结构--链表
数据结构·链表
网站优化(SEO)专家3 小时前
SEO核心算法拆解:网站排名快速提升的武林秘籍!
算法·搜索引擎·网站排名·核心算法
惊讶的猫3 小时前
CLGSI
人工智能·算法·机器学习