给线程一个顺序(及线程的同步)

信号量(线程同步)
头文件
#include <semaphore.h>
信号量的初始化:
int sem_init(sem_t *sem, int pshared, unsigned int value);
return: 0成功 -1失败
sem_t *sem: 要初始化的信号量
int pshared: 0表示线程间 1表示进程
unsigned int value: 初始化信号的资源数
p操作:
sem_wait
申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1 ,程序继续执行
v操作:
sem_post
V操作:释放资源,对应资源+1

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <unistd.h> #include <semaphore.h> /* 按顺序输出我是1我是2不会乱序。 */ sem_t rt, dt;//定义两个信号量 void *fun_1(void *arg)//线程1 { char *p = (char *)arg; while(1) { //申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1,程序继续执行 sem_wait(&rt); puts(p); sleep(1); //释放资源,对应资源+1 sem_post(&dt); } } void *fun_2(void *arg)//线程2 { char *p = (char *)arg; while(1){ //申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1,程序继续执行 sem_wait(&dt); puts(p); sleep(1); //释放资源,对应资源+1 sem_post(&rt); } } int main()//main函数内为主线程,主线程在运行子线程才能正常运行。 { pthread_t tid_1; pthread_t tid_2; if(0 != pthread_create(&tid_1, NULL, fun_1, "I am one!")){ perror("pthread_create1"); return -1; } if(0 != pthread_create(&tid_2, NULL, fun_2, "I am two!")){ perror("pthread_create1"); return -1; } //初始化信号量 if(0 != sem_init(&rt, 0, 1))//给rt分配1个资源 { perror("sem_init"); return -1; } if(0 != sem_init(&dt, 0, 0))//给dt分配0个资源 { perror("sem_init"); return -1; } while(1) { sleep(3); } }

注意:多线程程序在编译的时候需要链接对应的库-lpthread


__EOF__

本文作者西北小蚂蚁
本文链接https://www.cnblogs.com/JinShanCheShen/p/15036337.html
关于博主:山不向我走来,我便向他走去!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   西北小蚂蚁  阅读(64)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示