信号量,sem_init/wait/post/destroy函数的使用

sem_init();---------------------------------------------------------------------------------------

信号量的初始化函数定义在线程创建之前,资源变量定义为全局变量

一开始只有一个写资源,没有读资源

sem_wait();-------------------------------------------------------------------------------

sem_post();---------------------------------------------------------------------------------------------

资源变量定义为全局变量,且申请的和释放的不是同一个资源

  

sem_destroy();----------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------

用信号量实现按顺序输出“hello”,“world”

通过初始化定义资源是否有来实现

  

----------------------------------------------------------------------------------------------------------------

把tid号定义为全局变量,当票买到100张时,用pthread_cancel() 来结束其他两个子线程,并销毁三个信号量,该子线程直接由return结束。三个线程设置成pthread_detach(), 系统自动回收。

  

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为您解答这个问题。 首先,我们需要定义两个信号,一个用于控制输入的互斥,一个用于控制输出的同步。这里我们定义两个信号分别为`mutex`和`full`。 ```c #include <semaphore.h> sem_t mutex; // 互斥信号 sem_t full; // 同步信号 ``` 在主函数中,我们需要初始化这两个信号。 ```c int main() { // 初始化信号 sem_init(&mutex, 0, 1); // 初始值为1 sem_init(&full, 0, 0); // 初始值为0 // ... } ``` 然后,我们需要启动一个线程来输出输入的数据。这里我们定义一个`print_thread`函数作为线程函数。 ```c #include <pthread.h> void *print_thread(void *arg) { char *data = (char *)arg; while (1) { sem_wait(&full); // 等待输入完成 sem_wait(&mutex); // 获取互斥锁 if (strcmp(data, "quit") == 0) break; // 判断是否退出 printf("%s\n", data); // 输出数据 sem_post(&mutex); // 释放互斥锁 } sem_post(&mutex); // 释放互斥锁 pthread_exit(NULL); // 退出线程 } ``` 在主函数中,我们需要创建一个线程,并在循环中读取输入的数据,然后将数据传给线程函数输出。 ```c int main() { // ... pthread_t tid; pthread_create(&tid, NULL, print_thread, NULL); char data[1024]; while (1) { scanf("%s", data); sem_post(&full); // 发送信号通知线程可以输出 sem_wait(&mutex); // 获取互斥锁 if (strcmp(data, "quit") == 0) break; // 判断是否退出 sem_post(&mutex); // 释放互斥锁 } pthread_join(tid, NULL); // 等待线程结束 sem_destroy(&mutex); // 销毁信号 sem_destroy(&full); return 0; } ``` 这样,我们就完成了用`sem_init`、`sem_wait`和`sem_post`实现主线程输入,线程函数输出的程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值