在 C Linux 中使用三个线程使用信号量同步按顺序打印 3 4 5 50 次
print 3 4 5 in sequence for 50 times using semaphore synchronization using three threads in C Linux
我的编程陷入死锁。我正在尝试使用信号量同步使用三个线程按顺序打印三个数字 3 4 5 50 次。 请帮助我。
下面是代码
#include <iostream>
#include <pthread.h>
#include <semaphore.h>
using namespace std;
sem_t sem1;
sem_t sem2;
sem_t sem3;
void * fun1(void *)
{
for(int i = 0; i < 50 ; i++)
{
sem_wait(&sem1);
sem_wait(&sem3);
cout<<"3"
sem_post(&sem2);
sem_post(&sem3);
}
}
void * fun2(void *)
{
for(int i = 0; i < 50 ; i++)
{
sem_wait(&sem2);
sem_wait(&sem3);
cout<<"4";
sem_post(&sem3);
sem_post(&sem1);
}
}
void * fun3 (void *)
{
for(int i = 0; i< 50; i++)
{
sem_wait(&sem2);
sem_wait(&sem3);
cout<<"5";
sem_post(&sem1);
sem_post(&sem2);
}
}
int main()
{
pthread_t t1;
pthread_t t2;
pthread_t t3;
sem_init(&sem1,0,1);
sem_init(&sem2,0,0);
sem_init(&sem3,0,1);
pthread_create(&t1,NULL,&fun1,NULL);
pthread_create(&t2,NULL,&fun2,NULL);
pthread_create(&t3,NULL,&fun3,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_join(t3,NULL);
return 1;
}
请帮助我理解并解决这个僵局。提供建议,我也可以这样做,例如使用 3 个线程的 3 4 5 6 个线程
请帮助我理解并解决这个僵局。
您的代码中确实存在死锁。考虑一开始,线程 1 首先获得 2 个信号量并调用cout << "3"
。发布sem2
并sem3
后,线程 3 可能会立即获得这 2 个 sem,然后调用cout << "5"
。但是,在线程 3 发布sem1
并sem2
后,没有人能达成cout <<
语句,因为sem3
的值是 0,每个人都需要通过等待sem3
。
如果您想知道为什么完全没有输出,那是因为内部的缓冲区iostream
.对于控制台输出,"n"
将刷新缓冲区,因此如果将"3"
替换为"3n"
,则可以看到输出。
提供建议,我也可以这样做,例如使用 3 个线程的 3 4 5 6 个线程
在下面的代码中,您应该看到对称性,它可以很容易地推广到任意数量的线程。并且您应该始终在使用信号量后调用sem_destroy
,否则您可能会遇到系统级资源泄漏。
#include <iostream>
#include <pthread.h>
#include <semaphore.h>
using namespace std;
sem_t sem1;
sem_t sem2;
sem_t sem3;
void * fun1(void *)
{
for(int i = 0; i < 50 ; i++)
{
sem_wait(&sem1);
cout<<"3n";
sem_post(&sem2);
}
}
void * fun2(void *)
{
for(int i = 0; i < 50 ; i++)
{
sem_wait(&sem2);
cout<<"4n";
sem_post(&sem3);
}
}
void * fun3 (void *)
{
for(int i = 0; i< 50; i++)
{
sem_wait(&sem3);
cout<<"5n";
sem_post(&sem1);
}
}
int main()
{
pthread_t t1;
pthread_t t2;
pthread_t t3;
sem_init(&sem1,0,1);
sem_init(&sem2,0,0);
sem_init(&sem3,0,0);
pthread_create(&t1,NULL,&fun1,NULL);
pthread_create(&t2,NULL,&fun2,NULL);
pthread_create(&t3,NULL,&fun3,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_join(t3,NULL);
sem_destroy(&sem1);
sem_destroy(&sem2);
sem_destroy(&sem3);
return 1;
}
相关文章:
- 如何在C++中递归地按相反顺序打印集合
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 按字母顺序打印存储在字符数组中的信息
- 视觉C++未按所需顺序打印
- C++使用相反的顺序打印带有逗号的列表
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 对象指针打印结果以相反的顺序进行
- 链表缺少节点并在打印时颠倒顺序
- 如何以相反顺序C 打印整数的单个数字
- 我不知道如何创建一个以数字/字母顺序打印出我的整数或字符串的程序
- 在 C Linux 中使用三个线程使用信号量同步按顺序打印 3 4 5 50 次
- 以相反的顺序打印链表的后半部分
- 我如何附加双链接以指向正确的节点,以相反的顺序打印
- 为什么在打印东西时没有保留顺序,先用cerr,然后用cout
- 按字母顺序打印结构输入C
- 按顺序打印时遇到问题,二叉树的后顺序等
- 打印所有可能的组合,包括重复,顺序也很重要
- 按特定顺序打印队列
- C++ 中的打印顺序
- 为什么这段代码的打印顺序不像我预期的那样工作?