pthread mutex concurrent threads
От: mc-Duck  
Дата: 25.10.07 08:00
Оценка:
Здравствуйте все.

Сразу прошу извинить меня, если баян, поиск почему-то отказался мне помочь.

Я вообще редко пишу под *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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.