URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6690
[ Назад ]

Исходное сообщение
"как организовать критическую секцию в linux"

Отправлено Артем , 20-Авг-07 17:53 
В Windows если вызвать ::EnterCriticalSection() из одной и той же нити несколько раз, все вызовы будут успешны. Т.е. вот такой код не остановится навечно во втором вызове ::EnterCriticalSection(), а отработает до конца.

// Нить №1
void Proc1()
{
    ::EnterCriticalSection(&m_lock);
    // ...
    Proc2()
    // ...
    ::LeaveCriticalSection(&m_lock);
}

// Все еще нить №1
void Proc2()
{
    ::EnterCriticalSection(&m_lock);
    // ...
    ::LeaveCriticalSection(&m_lock);
}

как такого же добиться в Linux?


Содержание

Сообщения в этом обсуждении
"как организовать критическую секцию в linux"
Отправлено Michelnok , 20-Авг-07 18:09 
Если ты не про ядро, то предполагается что ты собираешься использовать мутексы из POSIX threads.

По-умолчанию поведение не определено, но есть тип мутексов PTHREAD_MUTEX_RECURSIVE.
Делает то что ты хочешь, т.е. можно вызывать pthread_mutex_lock в одном и том же потоке.
Так что:

pthread_mutexattr_t mutex_attr;
pthread_mutex_t mutex;
...
pthread_mutexattr_init(&mutex_attr);
pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&mutex, &attr);
...


"как организовать критическую секцию в linux"
Отправлено Ray Dudu , 20-Авг-07 18:10 
>как такого же добиться в Linux?

man pthread_mutexattr_settype на предмет PTHREAD_MUTEX_RECURSIVE