ubuntu下多线程简单的线程锁抢门票问题(代码片段)

survivor123 survivor123     2022-12-03     412

关键词:

该小程序创建了4个线程作为窗口进行演示抢票,程序中简单的使用pthread_mutex_lock与pthread_mutex_unlock:

main.c:

  1 #include<stdio.h>
  2 #include<pthread.h>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 #include<sched.h>
  6 #include<unistd.h>
  7 #define NUMBER 10   //总票数
  8 static int ticket=NUMBER;
  9 static int ticket1;//标志,1 有票 0 无票
 10 static pthread_mutex_t mut=PTHREAD_MUTEX_INITIALIZER;
 11 static void *send(void *arg);
 12 int main(void)
 13 
 14     pthread_t tid[4];
 15     int err;
 16     for(int i=1;i<5;i++)
 17         err=pthread_create(tid+i-1,NULL,send,(void *)i);
 18         if(err)
 19             fprintf(stderr,"pthread_create() %s \n",strerror(err));
 20             exit(1);
 21         
 22     
 23     //for(int i=0;i<5;i++)
 24     //  pthread_detach(tid[0]);
 25     pthread_mutex_lock(&mut);
 26     while(ticket)
 27         ticket1=1;
 28         pthread_mutex_unlock(&mut);
 29         sched_yield();
 30         pthread_mutex_lock(&mut);
 31         ticket--;
 32     
 33     pthread_mutex_unlock(&mut);
 34 
 35 
 36     for(int i=0;i<4;i++)
 37         pthread_join(tid[i],NULL);
 38     
 39 
 40     exit(0);
 41 
 42 
 43 static void *send(void *arg)
 44     int a=(int)arg;//接收窗口编号
 45     
 46     pthread_mutex_lock(&mut);
 47     while(ticket)
 48         while(!ticket1)
 49             pthread_mutex_unlock(&mut);
 50             sched_yield(); //这步不需要,本窗口卖出可以继续卖                                                                                                                                                                                                                                               
 51             pthread_mutex_lock(&mut);
 52             if(ticket==0)
 53                 goto ER;
 54         
 55         ticket1=0;
 56         sleep(1);
 57         printf("窗口[%d]卖出了No.[%d]演唱会门票\n",a,NUMBER-ticket+1);
 58     //  pthread_mutex_unlock(&mut);
 59         
 60     
 61     pthread_mutex_unlock(&mut);
 62     pthread_exit((void *)0);
 63 ER: 
 64     pthread_mutex_unlock(&mut);
 65     pthread_exit((void *)0);
 66    

编译:

(警告正常,int类型与void*转化)

[email protected]:~/6.dir/3-29.c/ticket$ gcc ticket.c -pthread
ticket.c: In function ‘main’:
ticket.c:17:40: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   err=pthread_create(tid+i-1,NULL,send,(void *)i);
                                        ^
ticket.c: In function ‘send’:
ticket.c:44:8: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
  int a=(int)arg;

结果:

[email protected]:~/6.dir/3-29.c/ticket$ ./a.out 
窗口[2]卖出了No.[1]演唱会门票
窗口[1]卖出了No.[2]演唱会门票
窗口[1]卖出了No.[3]演唱会门票
窗口[4]卖出了No.[4]演唱会门票
窗口[4]卖出了No.[5]演唱会门票
窗口[4]卖出了No.[6]演唱会门票
窗口[4]卖出了No.[7]演唱会门票
窗口[1]卖出了No.[8]演唱会门票
窗口[1]卖出了No.[9]演唱会门票
窗口[2]卖出了No.[10]演唱会门票

 

linux下多线程的操作(代码片段)

线程定义**定义:**线程是轻量级的进程(LWP:lightweightpocess),在Linux环境下线程的本质仍然是进程。在计算机上运行的程序是一组指令及指令参数的组合,指令按照既定的逻辑控制计算机运行。操作系统会以... 查看详情

线程池

...让两个以上的线程同时进行,这种方式叫做并行。首先说下多线程出现的原因:为了解决负载均衡问题,充分利用CPU资源.为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而不互相干扰.为了处理大量的IO操作时或处理的... 查看详情

多线程时间片问题

...入所占用的这段时间,我们就可以称之为时间片。举个多线程程序的例子,说明时间片是怎样工作的(java)如上:由此可见:两个线程是交替执行的(数字的变化),从宏观上(同时输出)。以下是搜的资料:1,什么是时间片... 查看详情

linux下多进程或者多线程编程的问题。新手,望指教!

c程序:假如main函数一直执行,到中间,用fork创建多个进程,或者用其他方法创建多个线程,而线程是无线循环的,那么main函数还好在创建这些线程或者进程之后继续执行吗?还是停止在那个创建语句上?然后,main函数如果继... 查看详情

并发编程-问题解决(代码片段)

概述  串行:一个线程在处理操作;  并行:多个线程在处理操作;  并发编程:在多线程环境下,应用程序的执行;  并发编程的目的:同分运用到资源,提供程序的效率  什么情况下用到并发编程:    1.在... 查看详情

java面试宝典线程安全问题|线程死锁的出现|线程安全的集合类(代码片段)

...赛第2期参赛话题:面试宝典文章目录  前言1、多线程概述1.1、线程的由来1.2、多线程特点2、线程安全问题2.1、互斥锁2.1.1、同步代码块2.1.2、同步方法2.2.3、两种同步思路的区别2.2、死锁2.2.1、线程通信2.2.2、sleep和wait的区... 查看详情

rr调度(round-robinscheduling)简单介绍

在RR调度策略下,一个线程会一直运行。直到:自愿放弃控制权被更高优先级的线程抢占时间片用完例如以下图所看到的,A在用完自己的时间片后,将CPU运行权让给线程B。于是A离开Read队列,而B进入Read队列。一旦线程的时间片... 查看详情

线程上下文切换(代码片段)

线程上下文切换(ThreadContextSwitch) 定义CPU执行线程的时候是通过时间分片的方式来轮流执行的,当某一个线程的时间片用完(到期),那么这个线程就会被中断,CPU不再执行当前线程,CPU会把使用权给其它线程来执行。如T1... 查看详情

pyqt下多线程使用案例

程序的主要功能1.串口接收数据2.解析串口指令帖并得到命令参数3。根据命令参数更新GUI其中1和2在一个线程,3在一个线程。指令格式 [int(‘7e‘,16),int(‘7e‘,16),0,0,0,0,0,0,int(‘8e‘,16),int(‘8e‘,16)]。中间的为数据,两端为帖... 查看详情

threadx内核源码分析-定时器及线程时间片调度(arm)(代码片段)

1、线程时间片介绍(tx_thread_time_slice)ThreadX内核同优先级线程之间是按时间片调度的,tx_thread_new_time_slice记录线程的时间片(一次调度的总的时间片),tx_thread_time_slice记录线程的剩余时间片(ThreadX内核每次调度线程时,并... 查看详情

我如何知道给线程的实际时间片?

】我如何知道给线程的实际时间片?【英文标题】:HowdoIgettoknowtheactualtimeslicegiventoathread?【发布时间】:2017-09-1507:27:45【问题描述】:我了解实际时间片是可变的,取决于操作系统和处理器等多种因素。但是有没有一种方法可以... 查看详情

threadx内核源码分析-定时器及线程时间片调度(arm)(代码片段)

1、线程时间片介绍(tx_thread_time_slice)ThreadX内核同优先级线程之间是按时间片调度的,tx_thread_new_time_slice记录线程的时间片(一次调度的总的时间片),tx_thread_time_slice记录线程的剩余时间片(ThreadX内核每次调度线程时,并... 查看详情

解决线程安全问题(代码片段)

线程带来的风险线程安全性问题出现安全性问题的需要满足的条件:多线程环境、有共享资源、非原子性操作活跃性问题死锁饥饿活锁性能问题cpu上下文切换会有性能问题(cpu分时间片执行)锁自旋锁自旋其实就是当一个线程获... 查看详情

多线程与进程

...在一个进程中)进程中所包含的一个或多个执行单位称为线程(thread)多线程多线程允许我们可以"同时"执行多段代码实际上多线程是并发运行的,即:JVM中的线程调度会为多个线程分配"CPU时间片",并将这些时间片尽可能... 查看详情

[c++11多线程同步]---线程同步概述(代码片段)

1线程调度的几个基本知识点多线程并发执行时有很多同学捋不清楚调度的随机性会导致哪些问题,要知道如果访问临界资源不加锁会导致一些突发情况发生甚至死锁。关于线程调度,需要深刻了解以下几个基础知识点:调度的... 查看详情

windows线程开发(代码片段)

Windows线程开发1.线程基础Windows线程是可以执行的代码实例。系统十一线程为单位调度程序。一个程序当中可以有多个线程,实现多个任务的处理。Windows线程的特点:线程都具有1个ID每个线程都具有自己的内存栈同一进程中的线... 查看详情

015输入理解时间片

线程   ●线程抢占式运行     ○启动两个线程       ○分别在第一个线程1-100       ○第二个线程里面101-200     ○未知     ○有一定规律的,哪个线程先抢到时间片,就先执行里面的所有... 查看详情

多线程的实现及其安全问题

一、进程和线程概述 1、进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动,简单来说开启一个程序就开启了一个进程; 如果开启多个进程,它们之间是由于CPU的时间片在相互的切换; 2、线程:开启一个... 查看详情