Здравствуйте все.
Сразу прошу извинить меня, если баян, поиск почему-то отказался мне помочь.
Я вообще редко пишу под *nix, но когда приходится, меня вообще часто радуют странным поведением библиотечные функции. Этот раз тоже не стал исключением
В моей программе есть несколько потоков, один из них работает с какими-то данными, второй иногда (редко) пытается эти данные модифицировать. Для разграничения доступа я навесил на данные мутекс. Однако, получилось, что второй поток вообще не может получить доступа к данным. Я попытался воспроизвести ситуацию в тестовом примере и вот что у меня получилось:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* threadfunc(void * str)
{
printf("starting thread %s", str);
while (true)
{
pthread_mutex_lock(&mutex);
printf((char *)str);
sleep(2);
pthread_mutex_unlock(&mutex);
}
return 0;
}
int main()
{
pthread_t thread1, thread2;
pthread_create(&thread1, 0, threadfunc, (void*)"thread1\n");
sleep(1);
pthread_create(&thread2, 0, threadfunc, (void*)"thread2\n");
sleep(100);
// здесь должна быть остановка потоков, но непринципиально
return 0;
}
Эта программа
ни разу не даёт потоку thread2 захватить мутекс. Я понимаю, что нельзя ожидать того, что они будут захватывать мутекс по очереди, но я ведь вправе рассчитывать, что каждый поток в принципе получит доступ к нему? Если нет — то вообще на кой такой примитив синхронизации нужен?
Это лыжи не едут или я ...?
PS проверял на
Linux system 2.6.16-2-xen-amd64-k8 #1 SMP Sun Jul 16 03:25:55 CEST 2006 x86_64 GNU/Linux
Linux system 2.6.9-5.EL #1 Wed Jan 5 19:22:18 EST 2005 i686 i686 i386 GNU/Linux