一、线程

首先我们说一下什么是线程。线程是计算机中独立运行的最小单位,在运行时占用很少的系统资源,由于每个线程占用的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相关推荐

  1. linux线程同步互斥说法,linux线程间的同步与互斥知识点总结

    在线程并发执行的时候,我们需要保证临界资源的安全访问,防止线程争抢资源,造成数据二义性. 线程同步: 条件变量 为什么使用条件变量? 对临界资源的时序可控性,条件满足会通知其他等待操作临界资源的线程, ...

  2. 铂金04:令行禁止-为何说信号量是线程间的同步利器

    欢迎来到<并发王者课>,本文是该系列文章中的第17篇. 在并发编程中,信号量是线程同步的重要工具.在本文中,我将带你认识信号量的概念.用法.种类以及Java中的信号量. 信号量(Semap ...

  3. Linux 线程如何实现同步与互斥

    线程安全:多个执行流对临界资源的争抢访问,但是并不会造成数据的二义性 线程的安全主要是通过同步和互斥来实现的 同步:通过条件判断保证对临界资源访问的合理性 互斥:通过同一时间的唯一访问实现对临界资源访 ...

  4. 线程间通信————同步

          同步 是指多个任务按照约定的先后次序 相互配合完成一件事情 信号量: 由信号量决定 线程是继续执行 还是阻塞等待 信号量代表某种资源 其值表示系统中该资源的数量 信号量是一个受保护的量 只 ...

  5. Python | threading03 - 使用条件对象,实现线程间的同步

    文章目录 一.前言 二.生产者-消费者的模型 2.1.代码 2.2.运行 2.3.wait( )方法会将互斥锁释放 三.条件同步 - threading.Condition( ) 3.1.相关API ...

  6. 消息队列用于线程间通信

    我们知道,消息队列是进程间通信的方法之一, 当然,消息队列也可以用于线程间通信. 进程间通信的时候,我们需要使用ftok()函数创建同一个key值,(当然,进程间通信,key值我们可以自定义同一个值, ...

  7. Linux c线程间的同步----互斥锁、条件变量、信号量

    线程 一个进程中的所有线程共享为进程分配的地址空间.所以进程地址空间中的代码段和数据段都是共享的. 如果定义一个函数在各个线程中都可以调用,定义一个全部变量,在各个线程中都可以访问到. 各线程共享资源 ...

  8. 进程/线程间的同步方式

    目录 1 临界区 1.1 解决冲突的办法 2 互斥量 3 信号量 4 事件 5 总结 1 临界区 通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 每个进程中访问临界资源的那段 ...

  9. 线程安全、同步与互斥机制以及死锁的产生与实现

    线程安全:多个执行流对临界资源争抢访问,但是不会出现数据二义性. 线程安全的实现:              同步:通过条件判断保证对临界资源访问的合理性.              互斥:通过同一时 ...

最新文章

  1. css3 点击爆炸下落
  2. c malloc 头文件_C 数据类型
  3. SAP Spartacus产品页面的normalizer
  4. 寻找素数分配线程算法
  5. JavaWeb源码网上商城系统a
  6. 一个独到程序员的深刻见解(转)
  7. ODM操作MongoDB
  8. L2 Switching
  9. 用matlab求状态转移矩阵(给定t)
  10. 几种css炫酷背景欣赏
  11. 数理统计——AQI分析
  12. react 项目的一个ie8兼容性问题
  13. 数据仓库 OLAP
  14. 目的:使用CUDA环境变量CUDA_VISIBLE_DEVICES来限定CUDA程序所能使用的GPU设备
  15. JMETER分享UBT
  16. 政务云灾备建设指南,助力政府数字化建设
  17. flv 协议解析 (学习记录)
  18. JAVA爬虫 - 爬取豆瓣租房信息
  19. 可视化 | pyecharts之柱状图常用配置篇
  20. 关于汽车相关产品的功能安全及其认证

热门文章

  1. MySQL中cast()与convert()的用法
  2. php中ini set,php ini_set函数的用法
  3. mysql 分组统计 取最大值_(Mysql)sql分组取最大值问题
  4. python dropout_Python slim.dropout方法代码示例
  5. java判断两线段是否相交
  6. 数据库中表名、字段名、字符串大小写处理规则
  7. MySQL中varchar类型字段隐式转换造成多删除数据
  8. python中float可以和int计算吗_python 中int ,float,字符串的操作
  9. php mysql时间倒序,php mysql时间已过去计算
  10. 对List集合中的对象进行按某个属性排序