探索Linux互斥:线程安全与资源共享

06-01 1229阅读

个人主页:chian-ocean

文章专栏-Linux

前言:

互斥是并发编程中避免竞争条件和保护共享资源的核心技术。通过使用锁或信号量等机制,能够确保多线程或多进程环境下对共享资源的安全访问,避免数据不一致、死锁等问题。

探索Linux互斥:线程安全与资源共享

竞争条件

竞争条件(Race Condition)是并发程序设计中的一个问题,指在多个线程或进程并发执行时,由于它们对共享资源的访问顺序不确定,可能导致程序的输出或行为依赖于执行的顺序,从而产生不一致或不可预测的结果。

例如:一个假脱机打印程序。当一个进程需要打印一个文件时,它将文件名放在一个特殊的假脱机目录**(spoalerdirectory)**下。另一个进程(打印机守护进程)则周期性地检查是否有文件需要打印,若有就打印并将该文件名从目录下删掉)

探索Linux互斥:线程安全与资源共享

  • 理想情况:

    1. 设想假脱机目录中有许多槽位,编号依次为0,1,2,……,每个槽位存放一个文件名。
    2. 同时假设有两个共享变量:out,指向下一个要打印的文件:in,指向目录中下一个空闲槽位。
    3. 可以把这两个变量保存在一个所有进程都out=4进程Ain=7能访问的文件中,该文件的长度为两个字。
    4. 在某一时刻,进程B号至3号槽位空(其中的文件已经打印完毕),4号至6号槽位被占用(其中存有排好队列的要打印的文件名)。几乎在同时刻,进程A和进程B都决定将一个文件排队打印,这种情图两个进程同时想访问共享内存
  • 实际情况:

    1. 进程A读到 in 的值为7,将7存在一个局部变量 next_free_slot中。
    2. 此时发生一次时钟中断,CPU认为进程A已运行了足够长的时间,决定切换到进程B。进程B也读取in,同样得到值为7,于是将7存在B的局部变量next_free_slot中。
    3. 在这一时刻两个进程都认为下一个可用槽位是7.进程B现在继续运行,它将其文件名存在槽位7中并将in的值更新为8。然后它离开,继续执行其他操作最后进程A接着从上次中断的地方再次运行。
    4. 它检查变量 next_free_slot,发现其值为7,于是将打印文作名存人7号槽位,这样就把进程B存在那里的文件名覆盖掉。然后它将 next_free_slot加1,得到值为8,就将8存到in中。
    5. 此时,假脱机目录内部是一致的,所以打印机守护进程发现不了任何错误,但进程B却永远得不到任何打印输出。类似这样的情况,即两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件(race condition)。

    实际抢票问题:

    #include
    #include
    #include
    using namespace std;
    #define NUM  10 // 定义线程数量,这里创建 10 个线程
    int ticket = 1000; // 票数从 1000 开始
    // 线程执行的函数
    void* mythread(void* args)
    {
        pthread_detach(pthread_self());  // 分离线程,线程结束后自动释放资源
        uint64_t number = (uint64_t)args;  // 将传入的参数(线程编号)转换为 uint64_t 类型
        while(true)
        {
            if(ticket > 0) // 如果还有票
            {
                usleep(1000); // 模拟一些延迟,减少系统负载
                cout 
                break; // 如果没有票了,退出循环
            }
            usleep(20);  // 再次暂停 20 微秒,模拟其他操作
        }
        return nullptr; // 线程结束时返回空指针
    }
    int main()
    {
        // 创建 NUM 个线程
        for(int i = 0; i 
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码