• 【操作系统实验】线程的创建+信号量通信


    sem_init:

    int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));  
    功能:初始化信号量
    返回值:创建成功返回0,失败返回-1
    参数sem:指向信号量结构的一个指针
    参数pshared:不为0时此信号量在进程间共享,为0时当前进程的所有线程共享
    参数value:信号量的初始值

    sem_wait():

    用来阻塞当前线程,直到信号量的值大于0,解除阻塞。解除阻塞后,sem的值-1,表示公共资源被执行减少了。
    例如:如果你对一个值为2的信号量调用sem_wait(),线程将会继续执行,执行后,信号量的值将-1。
    当初始化value=0后,使用sem_wait会阻塞这个线程,这个线程函数就会等待其它线程函数调用sem_post增加了了这个值使它不再是0, 才开始执行,然后value值-1。

    sem_post:

    用于增加信号量的值+1

    sem_destroy(&sem):

    释放信号量

    int pthread_create(pthread_t* restrict tidp,const pthread_attr_t* restrict_attr,void* (start_rtn)(void),void *restrict arg);

    功能:UNIX环境创建线程
    参数:
    (1)tidp:事先创建好的pthread_t类型的参数。成功时tidp指向的内存单元被设置为新创建线程的线程ID。
    (2)attr:用于定制各种不同的线程属性。APUE的12.3节讨论了线程属性。通常直接设为NULL。
    (3)start_rtn:新创建线程从此函数开始运行。无参数是arg设为NULL即可。
    (4)arg:start_rtn函数的参数。无参数时设为NULL即可。有参数时输入参数的地址。当多于一个参数时应当使用结构体传入。
    返回值:
    成功返回0,否则返回错误码。

    int pthread_join(pthread_t thread, void **retval);

    功能:主线程等待子线程的终止。也就是在主线程调用了pthread_join()方法后面的代码,只有等到子线程结束了才能执行。
    参数:
    pthread_t thread: 被连接线程的线程号
    void **retval : 指向一个指向被连接线程的返回码的指针的指针
    return:
    线程连接的状态,0是成功,非0是失败

    void pthread_exit(void *retval);

    功能:线程退出
    函数参数:retval表示线程退出状态,通常传NULL

    编译时注意:

    需加gcc work1.c -o work1 -lpthread

    #include
    #include
    #include
    #include
    #include
    sem_t sem; 
    void *runner(void * arg){
    		sem_wait(&sem);  //阻塞当前线程 直到pos释放信号量,使信号量大于0 继续运行下面的
    		printf("this is son pthread\n");
    		for(int i=5;i>=1;i--)
    		{
    			printf("第N号奶茶开始制作,预计等待时间%d秒\n",i);
    			sleep(1);
    		}
    	         pthread_exit(0);
    }
    int main(){
    	int res=-1;
    	res = sem_init(&sem,0,0); 
    	//初始化信号量 sem为指向信号量结构的一个指针,0:在所有线程间共享。0:信号量初值为0
    	//如果创建成功 返回0 失败返回-1
    	if(res == -1){ //创建失败
    		printf("semaphore iniitialzation failed\n");
    		exit(EXIT_FAILURE);
    	
    	}
    	pthread_t tid;
    	//创建线程runner
     	res = pthread_create(&tid,NULL,runner,NULL);
     	 //tid:事先创建好的pyhread_t类型的参数线程号。 NULL:通常设置的属性。runner:新建的线程函数。NULL参数。
     	 //返回值:0为创建成功
     	if(res!=0){
     		printf("pthread_create failed\n");
     		exit(EXIT_FAILURE);
     	}
     	printf("this is father pthread \n");
     	sem_post(&sem); //释放信号两 子线程开始执行
     	res = pthread_join(tid,NULL); //主线程等待子线程终止 tid:线程号 NULL:
     	printf("back to father thread\n");
    	printf("第N号奶茶可以取货!\n");
    	sem_destroy(&sem);  //释放信号量 sem+1信号量加一
    	return 0;		    
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    在这里插入图片描述

  • 相关阅读:
    你的第一款开源视频分析框架
    星际争霸之小霸王之小蜜蜂(十一)--杀杀杀
    1Panel应用推荐:KubePi开源Kubernetes管理面板
    Mysql主从复制之slave_exec_mode,slave_skip_errors参数详解和测试
    云原生时代---带你了解火爆的Quarkus技术
    Postman之Newman命令行运行脚本生成HTML报告
    开展网络口碑营销之前必须做好的几件事
    是什么,让中国成为一台超级计算机?
    Python Matplotlib库:基本绘图补充
    UE5 GAS 学习笔记 10.3 LyraStarter案例解析(中)
  • 原文地址:https://blog.csdn.net/Findprincess/article/details/128055101