首页 > 系统相关 >Linux多线程08-线程同步

Linux多线程08-线程同步

时间:2023-06-26 09:00:09浏览次数:40  
标签:NULL 08 门票 正在 线程 pthread 多线程 140146921383680

一个多线程售票示例:

// 三个窗口, 共100张票

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

int tickets = 100; //所有线程都共享这100张票
void* sellticket(void* arg){
    // 卖票
    while(tickets>0){
        usleep(6000); //间隔6000微秒
        printf("%ld 正在卖第 %d 张门票\n", pthread_self(), tickets);
        tickets--;
    }
    return NULL;
}

int main(){
    //创建3个子线程
    pthread_t tid1, tid2, tid3;
    pthread_create(&tid1, NULL, sellticket, NULL);
    pthread_create(&tid2, NULL, sellticket, NULL);
    pthread_create(&tid3, NULL, sellticket, NULL);

    //回收子线程资源, 阻塞
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    pthread_join(tid3, NULL);
    //或者设置线程分离
    //pthread_detach(tid1);
    //pthread_detach(tid2);
    //pthread_detach(tid3);

    pthread_exit(NULL);  //退出主线程
    return 0;
}

运行

140146921383680 正在卖第 100 张门票
140146921383680 正在卖第 99 张门票
...
140146921383680 正在卖第 94 张门票
140146921383680 正在卖第 93 张门票
140146921383680 正在卖第 92 张门票
140146921383680 正在卖第 91 张门票
140146921383680 正在卖第 90 张门票
140146921383680 正在卖第 89 张门票
140146929776384 正在卖第 90 张门票
140146929776384 正在卖第 87 张门票
140146929776384 正在卖第 86 张门票
...

出现问题: 三个线程会同时抢占共享资源导致数据出现错误, 所以我们要求在A线程操作共享数据时, B,C线程不允许操作

线程同步

  • 线程的主要优势在于,能够通过全局变量来共享信息。不过,这种便捷的共享是有代价的:必须确保多个线程不会同时修改同一变量,或者某一线程不会读取正在由其他线程修改的变量。
  • 临界区是指访问某一共享资源的代码片段,并且这段代码的执行应为原子操作,也就是同时访问同一共享资源的其他线程不应中断该片段的执行。
  • 线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作,而其他线程则处于等待状态。

标签:NULL,08,门票,正在,线程,pthread,多线程,140146921383680
From: https://www.cnblogs.com/anqwjoe/p/17504448.html

相关文章

  • 异步注解@Async使用自定义线程池
    1.@Async注解@Async是java中一个注解,其作用就是加上该注解的类或方法能够异步执行任务,该注解添加到方法上时,表示该方法是异步方法,添加到类上时,表示该类中的所有方法都是异步方法。该注解的代码为:可以看出其是作用在类和方法上,能够在运行时被获取到。当在使用@Async时,如果不指......
  • QT为什么只能由主线程操作UI
    QT为什么只能由主线程操作UI背景QT中,每次子线程去更新Ui都要通过信号槽去刷。其实不光是QT,很多GUI程序框架都是这么规定的。主线程:主线程是唯一允许创建QApplication或者QCoreApplication对象的,并且调用exec()启动事件循环的线程。原因直接原因:UI线程负责和用户交互,因此不能......
  • 超低功耗待机血压计语音IC方案,智能提示NV080C-S8
    随着我国步入21世纪的步伐和改革开放的不断深入,我国医疗水平和人民的生活水平不断提高,致使我国已经成为了全球老龄化为严重的国家,老年人占据的比重越来越大,一些常见的却不容易治愈的老年性疾病的预防工作已成为现今确保老年人生活质量的重要的举措。高血压位列老年人常见病发症的“......
  • Java多线程-Lesson02
    一.Lamda表达式λ是希腊字母表的第十一位字母,英文名是LambdaLamda表达式的出现主要是为了避免匿名内部类过多的原因,它属于函数式编程的范畴 为什么要使用Lamda表达式?避免匿名内部类定义过多可以让你的代码看起来很简洁去掉了没有意义的代码,只留下一堆核心逻辑主要使用在......
  • java 中的多线程问题
    结论  全局变量 多线程非安全  (堆) static局部变量 多线程安全  (栈) fina也可以安全1:线程调用时,每一个线程都拥有一套完整的调用栈帧,栈帧中包含完整的调用方法名,方法的局部变量。而且栈是先入后出,调用方法时入栈,方法结束是出栈。2:使用线程池时需要注意参数问......
  • C# .NET6结束UI线程
    在.NET6项目中,不再支持Thread.Abort:Thread.AbortisnotsupportedandthrowsPlatformNotSupportedException.原因是Thread.Abort可能导致资源泄漏,1.不正常的关闭,导致线程运行过程中待释放资源的业务代码,未能完成执行。2.异常捕获,业务模块未添加捕获、业务模块添加了捕获但......
  • ICT应用解决方案08-华为防火墙NAT及安全部署
    ICT应用解决方案08-华为防火墙NAT及安全部署1防火墙NAT1.1NAT技术的基本原理NAT技术通过对IP报文头中的源地址或目的地址进行转换,可以使大量的私网IP地址通过共享少量的公网IP地址来访问公网或使得公网可以访问私网NAT分类:静态NAT:服务器映射,一对一动态NAT:服务器......
  • 为什么js引擎是单线程?
    为什么js引擎是单线程?js的主要用途是与用户互动,以及操作DOM,这决定它只能是单线程。例:一个线程要添加DOM节点,一个线程要删减DOM节点,容易造成分歧。为了更好使用多CPU,H5提供了webWorker 标准,允许js创建多线程,但是子线程受到主线程控制,而且不得操作DOM。说说进程与线程的区别与......
  • 驱动开发:内核远程线程实现DLL注入
    在笔者上一篇文章《内核RIP劫持实现DLL注入》介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的,本章将继续探索全新的注入方式,通过NtCreateThreadEx这个内核函数实现注入DLL的目的,需要注意的是该函数在微软系统中未被导出使用时需要首先得到该函数的入口地址,NtCreateThreadEx......
  • 蔚来手撕代码题:三个线程循环打印ABC
    问题如下:https://www.nowcoder.com/discuss/493178141461041152思路分析三个线程交替打印ABC的实现方法有很多,我个人比较倾向于使用JUC下的CyclicBarrier(循环栅栏,也叫循环屏障)来实现,因为循环栅栏天生就是用来实现一轮一轮多线程任务的,它的核心实现思路如下图所示:Cycl......