Когда освобождается семафор, связанные потоки удаляются из блока, но планировщик не обязательно запускается.Таким образом, поведение не определено.
Просмотр кода семафора должен дать ответ.
Выполнение простого многопоточного теста может дать практический ответ.Один поток имеет цикл, который принимает sempanore и устанавливает переменную в 1, а затем освобождает переменную и устанавливает переменную в ноль.Другой поток в цикле берет семафор и печатает переменную, дважды и освобождает семафор.
Если расписание запускается после освобождения семафора, другой поток будет запущен немедленно, если не исходный потокработать до тех пор, пока он не заблокируется на семафоре.
На моей машине структура единиц и нулей была ошибочной.Добавление usleep () после выпуска семафора будет стимулировать запуск планировщика.Добавление во сне сделало его довольно стабильным.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER;
void *functionCount1();
void *functionCount2();
int x = 0;
void main()
{
pthread_t thread1, thread2;
pthread_create( &thread1, NULL, &functionCount1, NULL);
pthread_create( &thread2, NULL, &functionCount2, NULL);
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
exit(0);
}
void *functionCount1()
{
for(;;)
{
pthread_mutex_lock( &count_mutex );
x = 0;
pthread_mutex_unlock( &count_mutex );
// usleep(10);
x = 1;
}
}
void *functionCount2()
{
for(;;)
{
pthread_mutex_lock( &count_mutex );
printf("%d", x);
// usleep(10);
printf("%d", x);
pthread_mutex_unlock( &count_mutex );
}
}