Ich mag Threads synchronisieren, von 1 bis 20 mit ungerader Zahl von thread1 und geraden Zahlen gedruckt von Thread2Thread-Synchronisation für zwei Threads unter Verwendung eines Semaphor
I dies mit zwei Semaphoren erreicht gedruckt zu drucken.
Fragen:
1) Kann dies nur ein Semaphor verwendet erreicht werden?
2) Gibt es einen effizienten Weg, dies zu erreichen?
Wenn möglich, bitte auch ein Beispiel angeben.
sem_t bin_sem1, bin_sem2;
int count = 1;
int main()
{
int ret;
pthread_t a_thread, b_thread;
ret = sem_init(&bin_sem1, 0, 1);
if (ret != 0)
{
perror("semaphore1 initialization failed\n");
exit(EXIT_FAILURE);
}
ret = sem_init(&bin_sem2, 0, 0);
if (ret != 0)
{
perror("semaphore2 initialization failed\n");
exit(EXIT_FAILURE);
}
ret = pthread_create(&a_thread, NULL, thread_fun1, NULL);
if (ret != 0)
{
perror("Thread1 creation failed");
exit(EXIT_FAILURE);
}
ret = pthread_create(&b_thread, NULL, thread_fun2, NULL);
if (ret != 0)
{
perror("Thread2 creation failed");
exit(EXIT_FAILURE);
}
printf("Waiting for threads to finish\n");
ret = pthread_join(a_thread, NULL);
if (ret != 0)
{
perror("Thread1 join failed");
exit(EXIT_FAILURE);
}
printf("Thread1 joined");
ret = pthread_join(b_thread, NULL);
if (ret != 0)
{
perror("Thread2 join failed");
exit(EXIT_FAILURE);
}
printf("Thread2 joined");
exit(EXIT_SUCCESS);
}
void *thread_fun1(void *arg)
{
int val=0, val2=0;
while (count < 20)
{
sem_wait(&bin_sem1);
sem_getvalue(&bin_sem1, &val);sem_getvalue(&bin_sem2, &val2);
printf("T 1 : after wait : sem 1 = %d, sem 2 = %d\n", val, val2);
printf("T 1 : count = %d\n", count++);
sem_post(&bin_sem2);
sem_getvalue(&bin_sem1, &val);sem_getvalue(&bin_sem2, &val2);
printf("T 1 : after post : sem 1 = %d, sem 2 = %d\n", val, val2);
}
pthread_exit(NULL);
}
void *thread_fun2(void *arg)
{
int val=0, val2=0;
while (count < 20)
{
sem_wait(&bin_sem2);
sem_getvalue(&bin_sem1, &val);sem_getvalue(&bin_sem2, &val2);
printf("\t\t\t\t\t\tT 2 : after wait : sem 1 = %d, sem 2 = %d\n", val, val2);
printf("\t\t\t\t\t\tT 2 : count = %d\n", count++);
sem_post(&bin_sem1);
sem_getvalue(&bin_sem1, &val);sem_getvalue(&bin_sem2, &val2);
printf("\t\t\t\t\t\tT 2 : after post : sem 1 = %d, sem 2 = %d\n", val, val2);
}
pthread_exit(NULL);
}
Anstatt Semaphore zu verwenden, warum nicht atomare Typen verwenden? – Linus
@Linus im Allgemeinen, weil Sie nicht auf sie warten können. –