C代码pthread信号量程序,有3个线程按顺序打印
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C代码pthread信号量程序,有3个线程按顺序打印相关的知识,希望对你有一定的参考价值。
我想打印顺序像1,2,3,1,2,3 ......但下面的代码不按此顺序打印。我无法理解我在使用信号量时犯了错误。请帮助我理解我在这段代码中犯的错误,以便我能解决它。
#include <pthread.h>
#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>
#define MAX_NUM 50
sem_t sem1, sem2, sem3;
void *f1(void*)
{
sem_wait(&sem1);
for(int i=1; i<=MAX_NUM; i++)
{
printf("
F1(): %d", 1);
sem_post(&sem2);
}
}
void* f2(void*)
{
sem_wait(&sem2);
for(int i=1; i<=MAX_NUM; i++)
{
printf("
F2(): %d", 2);
sem_post(&sem3);
}
}
void* f3(void*)
{
sem_wait(&sem3);
for(int i=1; i<=MAX_NUM; i++)
{
printf("
F3(): %d", 3);
sem_post(&sem1);
}
}
int main()
{
pthread_t p1, p2, p3;
sem_init(&sem1, 0, 1);
sem_init(&sem2, 0, 1);
sem_init(&sem3, 0, 1);
pthread_create(&p1, NULL, f1, (void*)NULL);
pthread_create(&p2, NULL, f2, (void*)NULL);
pthread_create(&p3, NULL, f3, (void*)NULL);
pthread_join(p1, NULL);
pthread_join(p2, NULL);
pthread_join(p3, NULL);
return 0;
}
答案
你需要以不同于其他的方式初始化sem1
,以便F1
首先超过其最初的sem_wait
。
另请注意,一旦每个函数进入其循环,它再也不会调用sem_wait
,这意味着您无法再控制打印顺序。
另一答案
使用0初始化sem 2和sem 3并在所有函数中将sem_wait(...)调用内部循环。我希望下面的代码给出预期结果123123 ...
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#define MAX_NUM 50
sem_t sem1, sem2, sem3;
void *f1(void* p)
{
for(int i=1; i<=MAX_NUM; i++)
{
sem_wait(&sem1);
printf("
F1(): %d", 1);
sem_post(&sem2);
}
}
void *f2(void* p)
{
for(int i=1; i<=MAX_NUM; i++)
{
sem_wait(&sem2);
printf("
F2(): %d", 2);
sem_post(&sem3);
}
}
void *f3(void* p)
{
for(int i=1; i<=MAX_NUM; i++)
{
sem_wait(&sem3);
printf("
F3(): %d", 3);
sem_post(&sem1);
}
}
int main()
{
pthread_t p1, p2, p3;
sem_init(&sem1, 0, 1);
sem_init(&sem2, 0, 0);
sem_init(&sem3, 0, 0);
pthread_create(&p1, NULL, f1, (void*)NULL);
pthread_create(&p2, NULL, f2, (void*)NULL);
pthread_create(&p3, NULL, f3, (void*)NULL);
pthread_join(p1, NULL);
pthread_join(p2, NULL);
pthread_join(p3, NULL);
return 0;
}
以上是关于C代码pthread信号量程序,有3个线程按顺序打印的主要内容,如果未能解决你的问题,请参考以下文章
POSIX(Linux多线程)使用信号量三个线程顺序打印十次123
如何为 3 个不同的事件(信号量、pthread 条件和阻塞套接字接收)阻塞单个线程?
C ++中std :: thread优于pthread的优势[重复]