Я хочу для синхронизации потоков для печати от 1 до 20 с нечетными номерами, напечатанных thread1 и четных чисел, напечатанных thread2синхронизации потоков для двух потоков с использованием одного семафора
Я достиг этого с двумя семафоров.
Вопросы:
1) Может ли это быть достигнуто, используя только один семафор?
2) Есть ли эффективный способ достичь этого?
Если возможно, укажите пример.
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);
}
Вместо использования семафоров, почему бы не использовать атомные типы? – Linus
@ Linus вообще, потому что вы не можете дождаться их. –