用于线程间的同步与互斥-信号量sem
一、线程
首先我们说一下什么是线程。线程是计算机中独立运行的最小单位,在运行时占用很少的系统资源,由于每个线程占用的CPU时间是由系统分配的,因此我们可以把线程看作为系统分配CPU时间的基本单位。在我们用户看来多线程是并发执行的,但是从操作系统的角度来看,对于单核CPU来说各个线程是交替执行的,系统在各个线程之间不停的切换,每个线程只有在系统分配给它的时间内获得cup的控制权,执行线程中的代码。
二、线程的使用
了解了什么是线程之后,我们就可以使用线程,这里我们通过三个函数来对线程进行操作。
头文件:#include <pthread.h>
1.创建线程:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
参数:
thread:用来存放线程id号
attr: 线程的属性,一般用NULL
start_routine:函数指针,指线程要做的事情,类似于信号处理函数。
arg:给函数传递的参数,没有可用使用NULL
返回值:
成功:0
失败:errno
举个栗子:
pthread_t thread_A;
pthread_create(&thread_A,NULL,handler_A,NULL)
2.退出线程
void pthread_exit(void *retval);
参数:传递给接收函数的参数,标识退出状态
举个栗子:
pthread_exit((void *)0);
3.阻塞等待接收线程退出状态,并回收资源
int pthread_join(pthread_t thread,void **retval)
参数:
thread 线程号
*retval:不关心一般为NULL
返回值:成功 0 ,失败 errno
举个栗子:
pthread_join(thread_A,NULL);
三、信号量的使用
信号量:也就是操作系统中的PV原子操作,用户线程之间的同步与互斥。本质是一个非负整数计数器,被用来控制 公共资源的访问。
P操作(申请资源):如果有可用资源(信号量值大于0),则占用一个资源(信号量值-1,进入临界区代码),如果没有可用资源(信号量值等于0),则阻塞,直到系统将资源分配给线程。
V操作(释放资源):如果该信号量的等待队列有任务在等待资源,则唤醒一个任务,如果没有则释放信号量。
头文件:#include <semaphore.h>
1.初始化:int sem_init(sem_t *sem, int pshared, unsigned int value);
参数:
sem:信号量标识
pshared:用于线程间通信, 0
value:信号量的处置,代表可用资源数个数,为了实现互斥现象一般为1.
返回值:成功 0 ,失败 -1.
2.申请资源:int sem_wait(sem_t *sem)
功能:申请资源
参数:sem‘’
返回值:成功0 失败-1
3.释放资源: int sem_post(sem_t *sem); Link with -pthread.
功能:释放资源
参数:sem‘’
返回值:成功0 失败-1
4.销毁信号量 int sem_destroy(sem_t *sem); Link with r -pthread.
功能:释放资源
参数:sem‘’
返回值:成功0 失败-1
下面给大家一个关于线程的青宁的面试题
1、 /编写一个程序,开启三个线程,这三个线程的ID分别是ABC,每个线程将自己的ID在屏幕上打印10遍,/要求输出必须按照ABC的顺序显示,如:ABCABCABC….。
6 #include <stdio.h>7 #include <pthread.h>8 #include <semaphore.h>9 10 sem_t sem_A;11 sem_t sem_B;12 sem_t sem_C;13 14 void *pthread_A_handler(void)15 {16 int i;17 for(i=0; i<10; i++){18 sem_wait(&sem_C); 19 printf("A\n");20 sem_post(&sem_A);21 }22 pthread_exit((void *)0);23 }24 25 void *pthread_B_handler(void)26 {27 int i;28 for(i=0; i<10; i++){29 sem_wait(&sem_A);30 printf("B\n");31 sem_post(&sem_B);32 }33 pthread_exit((void *)0);34 }36 void *pthread_C_handler(void)37 {38 int i;39 for(i=0; i<10; i++){40 sem_wait(&sem_B);41 printf("C\n");42 sem_post(&sem_C);43 }44 pthread_exit((void *)0);45 }46 int main()47 {48 pthread_t pthread_A;49 pthread_t pthread_B;50 pthread_t pthread_C;51 int ret;52 ret = sem_init(&sem_A,0,0);53 if(ret != 0) {54 printf("sem_init error\n"); 55 return 1;56 }57 ret = sem_init(&sem_B,0,0);58 if(ret != 0) {59 printf("sem_init error\n");60 return 1;61 }62 ret = sem_init(&sem_C,0,1);63 if(ret != 0) {64 printf("sem_init error\n");65 return 1;66 }67
ret = pthread_create(&pthread_A,NULL,pthread_A_handler,NULL);69 if(ret != 0) {70 printf("pthread_create error\n");71 return 1;72 }73 ret = pthread_create(&pthread_B,NULL,pthread_B_handler,NULL);74 if(ret != 0) {75 printf("pthread_create error\n"); 76 return 1;77 }78 ret = pthread_create(&pthread_C,NULL,pthread_C_handler,NULL);79 if(ret != 0) {80 printf("pthread_create error\n");81 return 1;82 }83 84 85 pthread_join(pthread_A,NULL);86 pthread_join(pthread_B,NULL);87 pthread_join(pthread_C,NULL);88 sem_destroy(&sem_A);89 sem_destroy(&sem_B);90 sem_destroy(&sem_C);91 return 0;92 }
用于线程间的同步与互斥-信号量sem相关推荐
- linux线程同步互斥说法,linux线程间的同步与互斥知识点总结
在线程并发执行的时候,我们需要保证临界资源的安全访问,防止线程争抢资源,造成数据二义性. 线程同步: 条件变量 为什么使用条件变量? 对临界资源的时序可控性,条件满足会通知其他等待操作临界资源的线程, ...
- 铂金04:令行禁止-为何说信号量是线程间的同步利器
欢迎来到<并发王者课>,本文是该系列文章中的第17篇. 在并发编程中,信号量是线程同步的重要工具.在本文中,我将带你认识信号量的概念.用法.种类以及Java中的信号量. 信号量(Semap ...
- Linux 线程如何实现同步与互斥
线程安全:多个执行流对临界资源的争抢访问,但是并不会造成数据的二义性 线程的安全主要是通过同步和互斥来实现的 同步:通过条件判断保证对临界资源访问的合理性 互斥:通过同一时间的唯一访问实现对临界资源访 ...
- 线程间通信————同步
同步 是指多个任务按照约定的先后次序 相互配合完成一件事情 信号量: 由信号量决定 线程是继续执行 还是阻塞等待 信号量代表某种资源 其值表示系统中该资源的数量 信号量是一个受保护的量 只 ...
- Python | threading03 - 使用条件对象,实现线程间的同步
文章目录 一.前言 二.生产者-消费者的模型 2.1.代码 2.2.运行 2.3.wait( )方法会将互斥锁释放 三.条件同步 - threading.Condition( ) 3.1.相关API ...
- 消息队列用于线程间通信
我们知道,消息队列是进程间通信的方法之一, 当然,消息队列也可以用于线程间通信. 进程间通信的时候,我们需要使用ftok()函数创建同一个key值,(当然,进程间通信,key值我们可以自定义同一个值, ...
- Linux c线程间的同步----互斥锁、条件变量、信号量
线程 一个进程中的所有线程共享为进程分配的地址空间.所以进程地址空间中的代码段和数据段都是共享的. 如果定义一个函数在各个线程中都可以调用,定义一个全部变量,在各个线程中都可以访问到. 各线程共享资源 ...
- 进程/线程间的同步方式
目录 1 临界区 1.1 解决冲突的办法 2 互斥量 3 信号量 4 事件 5 总结 1 临界区 通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 每个进程中访问临界资源的那段 ...
- 线程安全、同步与互斥机制以及死锁的产生与实现
线程安全:多个执行流对临界资源争抢访问,但是不会出现数据二义性. 线程安全的实现: 同步:通过条件判断保证对临界资源访问的合理性. 互斥:通过同一时 ...
最新文章
- css3 点击爆炸下落
- c malloc 头文件_C 数据类型
- SAP Spartacus产品页面的normalizer
- 寻找素数分配线程算法
- JavaWeb源码网上商城系统a
- 一个独到程序员的深刻见解(转)
- ODM操作MongoDB
- L2 Switching
- 用matlab求状态转移矩阵(给定t)
- 几种css炫酷背景欣赏
- 数理统计——AQI分析
- react 项目的一个ie8兼容性问题
- 数据仓库 OLAP
- 目的:使用CUDA环境变量CUDA_VISIBLE_DEVICES来限定CUDA程序所能使用的GPU设备
- JMETER分享UBT
- 政务云灾备建设指南,助力政府数字化建设
- flv 协议解析 (学习记录)
- JAVA爬虫 - 爬取豆瓣租房信息
- 可视化 | pyecharts之柱状图常用配置篇
- 关于汽车相关产品的功能安全及其认证
热门文章
- MySQL中cast()与convert()的用法
- php中ini set,php ini_set函数的用法
- mysql 分组统计 取最大值_(Mysql)sql分组取最大值问题
- python dropout_Python slim.dropout方法代码示例
- java判断两线段是否相交
- 数据库中表名、字段名、字符串大小写处理规则
- MySQL中varchar类型字段隐式转换造成多删除数据
- python中float可以和int计算吗_python 中int ,float,字符串的操作
- php mysql时间倒序,php mysql时间已过去计算
- 对List集合中的对象进行按某个属性排序