Ich habe eine Funktion, die von thread1,2,3,4 ausgeführt wird .... Sobald thread1 Zugriff auf die Funktion erhält, verwende ich thread_cond für das Warten auf die anderen Threads. Sobald thread1 seine Arbeit erledigt, sende ich thread_signal an den gleichen cond. Thread2 führt die Funktion aus. Aber nachdem die Ausführung beendet ist, erhalten die anderen Threads keinen Zugriff auf die Funktion.Wie kann man sicherstellen, dass die Threads 2,3 und 4 auf das gleiche Signal von Thread1 warten?
Bitte helfen Sie mir
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
int limit = 0;
pthread_mutex_t mutex[100];
pthread_cond_t cond[100];
pthread_t tid[100];
void *enter()
{
if (limit == 1)
{
printf("waiting\n");
pthread_cond_wait(&cond[1],&mutex[1]);
}
gotofunction();
}
void gotofunction()
{
limit++;
/* Do work */
printf("Doing work\n");
sleep(1);
limit--;
printf("Going to give signal\n");
pthread_cond_signal(&cond[1]);
}
int main()
{
int n,i;
scanf("%d",&n);
for (i=0;i<100;i++)
{
pthread_mutex_init(&mutex[i], NULL);
pthread_cond_init(&cond[i], NULL);
}
for (i=0;i<n;i++)
{
pthread_create(&tid[i], NULL, enter, NULL);
sleep(0.5);
}
for (i=1;i<=n;i++)
{
pthread_join(tid[i], NULL);
}
}
Grundsätzlich thread1 prints "tun Arbeit" Thread2 prints "Arbeit erledigt" Dann nichts für die anderen Threads geschieht
Das 'pthread_cond_signal' signalisiert nur * einen * (zufälligen) Thread. Wenn Sie die Handbuchseite für z.B. 'Pthread_cond_signal', es sagt Ihnen nichts über eine andere Funktion? Vielleicht ein [* broadcast *] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_broadcast.html) das Signal? –
@Someprogrammerdude Ich glaube Broadcast weckt alle Threads auf. Ich möchte nur einen der thread aufwecken und seine arbeit dann wecken einen weiteren thread usw. – user7693981
Dann vielleicht eine * kette * von 'pthread_cond_signal'? Sobald ein Thread nach einem Signal aufwacht, ruft er wiederum 'pthread_cond_signal' auf. –