十一.linux多线程同步之互斥锁、信号量、条件量

本文详细介绍了Linux多线程同步的三种机制:互斥锁、信号量和条件变量。通过实例解析了如何使用信号量实现用户输入统计,互斥锁的概念及函数用法,并探讨了条件变量的原理及其在同步中的应用。
摘要由CSDN通过智能技术生成

笔记:https://note.youdao.com/ynoteshare1/index.html?id=1b529d966d34b16f3bdd828be48364e4&type=note

目录

一.线程同步之信号量

1、任务:用户从终端输入任意字符然后统计个数显示,输入end则结束

2、信号量的介绍和使用(多线程实行的引入)

(1)、信号量初始化

(2)、等待信号量

(3)、释放信号量

(4)、销毁信号量

3、使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数

二.线程同步之互斥锁

1、什么是互斥锁

(1)互斥锁又叫互斥量(mutex)

(2)相关函数:

2、用互斥锁来实现上节的代码,

三.线程同步之条件变量

1、什么是条件变量

2、相关函数

3、使用条件变量来实现上节代码


一.线程同步之信号量

1、任务:用户从终端输入任意字符然后统计个数显示,输入end则结束

int main(void)

{

char buf[100] = {0};

printf("请输入一个字符串,以回车结束\n");

while(scanf("%s",buf))

{

//去比较输入的是否为end,是则退出,不是则继续

if(strncmp(buf,"end",3)==0)

{

printf("程序结束\n");

return 0;

}

printf("本次输入了%d个字符\n",strlen(buf));

memset(buf,0,sizeof(buf));

}

return 0;

}

 

2、信号量的介绍和使用(多线程实行的引入)

与进程一样,线程也可以使用信号量来通信。线程使用信号量同步线程的步骤如下:

  • (1)、信号量初始化

int sem_init (sem_t *sem , int pshared, unsigned int value);

        对sem指定的信号量进行初始化,pshared:设置好共享选项(linux只支持为0,即表示它是当前进程的局部信号量),然后给它一个初始值VALUE。

  • (2)、等待信号量

int sem_wait(sem_t *sem);

给信号量减1,然后等待直到信号量的值大于0。

  • (3)、释放信号量

int sem_post(sem_t *sem);

信号量值加1。并通知其他等待线程。

  • (4)、销毁信号量

        int sem_destroy(sem_t *sem);

 

 

3、使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数

E:\Linux\3.AppNet\6.thread\6.3

char buf[100] = {0};

sem_t sem;

unsigned int flag=0;

 

void *func(void *arg)//子线程计数

{

//子线程首先应该有个循环

/*循环中阻塞在等待主线程激活的时候,子线程被激活后就去获取buf中的字符长度,然后打印,完成后再次阻塞*/

while(flag==0)

{

//②等待信号量,信号量没来之前一直阻塞在这里

sem_wait(&sem);

printf("本次输入了%d个字符\n",strlen(buf));

memset(buf,0,sizeof(buf));//清除buf

sem_wait(&sem);

}

pthread_exit(NULL);//线程终止

}

 

int main(void)

{

pthread_t th = -1;

int ret = -1;

//①信号量初始化

sem_init (&sem , 0, 0);

/* 创建线程 */

ret = pthread_create(&th, NULL, func, NULL);

if(ret !=0)

{

perror("pthread_create error.\n");

return -1;

}

printf("请输入一个字符串,以回车结束\n");

while(scanf("%s",buf))

{

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值