信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区。

不多做解释,要使用信号量同步,需要包含头文件semaphore.h。

主要用到的函数:

  • int sem_init(sem_t *sem, int pshared, unsigned int value);,其中sem是要初始化的信号量,pshared表示此信号量是在进程间共享还是线程间共享,value是信号量的初始值。
  • int sem_destroy(sem_t *sem);,其中sem是要销毁的信号量。只有用sem_init初始化的信号量才能用sem_destroy销毁。
  • int sem_wait(sem_t *sem);等待信号量,如果信号量的值大于0,将信号量的值减1,立即返回。如果信号量的值为0,则线程阻塞。相当于P操作。成功返回0,失败返回-1。
  • int sem_post(sem_t *sem); 释放信号量,让信号量的值加1。相当于V操作。
 
 
//用户从终端输入任意字符然后统计个数显示,输入end则结束
//使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数
#include<stdio.h>
#include <pthread.h>
#include<stdlib.h>
#include <string.h>
#include <semaphore.h>

      
char buf[100]={0}; 
int flag;
sem_t sem;
// 子线程程序,作用是统计buf中的字符个数并打印
void *func(void*arg)
{
// 子线程首先应该有个循环
// 循环中阻塞在等待主线程激活的时候,子线程被激活后就去获取buf中的字符
// 长度,然后打印;完成后再次被阻塞
sem_wait(&sem);
while(flag==0)
{

printf("长度为:%d.\n",strlen(buf));
memset(buf, 0, sizeof(buf));
sem_wait(&sem);
}

    pthread_exit(NULL);

}

int main(void)
{
int ret=-1;
pthread_t th;

sem_init(&sem,0,0);

ret=pthread_create(&th,NULL,func,NULL);
        if (ret != 0)
{
printf("pthread_create error.\n");
return -1;
}                    

printf("输入一个字符串,以回车结束.\n");
while(scanf("%s",buf))
{
// 去比较用户输入的是不是end,如果是则退出,如果不是则继续

if(!strncmp(buf,"end",3))
{
printf("输入的字符串为:%s",buf);
flag==1;
sem_post(&sem);
break;
}
// 主线程在收到用户收入的字符串,并且确认不是end后
// 就去发信号激活子线程来计数。
// 子线程被阻塞,主线程可以激活,这就是线程的同步问题。
// 信号量就可以用来实现这个线程同步

sem_post(&sem);
    }

/*
// 回收子线程
printf("等待回收子线程\n");
ret = pthread_join(th, NULL);
if (ret != 0)
{
printf("pthread_join error.\n");
exit(-1);
}
printf("子线程回收成功\n");

sem_destroy(&sem);
*/
return 0;

}

最新文章

  1. C#如何获取本机网络IP地址
  2. phpcms手机门户相关
  3. window通过mstsc远程连接其它计算机
  4. Java程序的安装、配置、创建项目
  5. php中引用和赋值的区别主要在哪里
  6. webview 中 svg的坑
  7. python测试api接口
  8. vsftp 安装日志
  9. 成小胖学习ActiveMQ&#183;基础篇
  10. MySQL 报错 _DATA_TYPE_INVALID_
  11. 深入理解Java中的不可变对象
  12. Linux内核内存管理架构
  13. C++ 配置文件类的封装
  14. PostgreSQL自学笔记:1 初识 PostgreSQL
  15. 学习总结:CSS(一)定义方式、选择器、选择器权重
  16. 最全免费CDN公共库——网站提速
  17. repo 获取各个库的tag代码或者分支代码
  18. [CodeForces 372A] Counting Kangaroos is Fun
  19. git中出现remote: HTTP Basic: Access denied
  20. Faster R-CNN代码例子

热门文章

  1. 本地jar添加到本地仓库 本地jar依赖无效问题
  2. MyBatis初级实战之六:一对多关联查询
  3. 天天用SpringBoot居然还不知道它的自动装配的原理?
  4. linux opt, usr文件夹说明
  5. SQL Server 日志收缩方法
  6. history附上时间戳,history命令_Linux history命令:查看和执行历史命令
  7. Python虚拟环境配置应用
  8. axios用法
  9. 我们都可以把它放 Sidecar 容器中,这样微服务具备了 Super power,一种超能力
  10. windows命令行关闭IE代理