printf()
не изменяет свои переменные аргументы. Тем не менее, printf()
- это операция, стоимость которой достаточна для выявления рас, вызванных отсутствием (или неправильной) блокировкой между потоками.
То, что вы хотите использовать, это мьютекс:
pthread_mutex_t thread_lock = PTHREAD_MUTEX_INITIALIZER;
void *thread_func(void *threadarg)
{
thread_overview_control *toc = (thread_overview_control *)threadarg;
pthread_mutex_lock(&thread_lock);
printf("%d\n", toc->runlist.next);
printf("%d\n", toc->runlist.next);
pthread_mutex_unlock(&thread_lock);
....
В этом примере pthread_mutex_lock()
будет блокироваться, если другой поток заблокирован. Если ваша функция может выполнять другую полезную работу в ожидании блокировки, попробуйте pthread_mutex_trylock()
, возможно, в цикле while()
.
Просто убедитесь, что каждый поток может добраться до мьютекса, сделав его глобальным (или поместив его в структуру, к которой у каждого есть доступ). В равной степени важно инициализировать мьютекс с помощью PTHREAD_MUTEX_INITIALIZER
, иначе вы рискуете удержать блокировку без какого-либо потока, фактически удерживающего ее.
Всякий раз, когда вы читаете или пишете в *toc
, вам необходимо получить блокировку.