1,2,3,1,2,3のようなシーケンスを印刷したいのですが、下のコードはこの順に印刷されません。私はセマフォを使ってどこで間違っているのか理解できません。私がこのコードで修正している間違いを理解するのを助けてください。 F1
が初期sem_wait
最初通り過ぎなるようCコードpthread順番に印刷する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("\nF1(): %d", 1);
sem_post(&sem2);
}
}
void* f2(void*)
{
sem_wait(&sem2);
for(int i=1; i<=MAX_NUM; i++)
{
printf("\nF2(): %d", 2);
sem_post(&sem3);
}
}
void* f3(void*)
{
sem_wait(&sem3);
for(int i=1; i<=MAX_NUM; i++)
{
printf("\nF3(): %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;
}
あなたはセマフォのすべてを初期化します同じ方法で、それらをすべて同じ方法で使用します。なぜF1が最初に印刷されると思いますか? –