Блокировка мьютекса в одном потоке и разблокировка его в другом

извините за мой английский - я русский.

будет ли этот код корректным и переносимым?

void* aThread(void*)
{
    while(conditionA)
    {
        pthread_mutex_lock(mutex1);
        //do something
        pthread_mutex_unlock(mutex2);
    }
}

void* bThread(void*)
{
    while(conditionB)
    {
        pthread_mutex_lock(mutex2);
        //do something
        pthread_mutex_unlock(mutex1);
    }
}

на самом деле в приложении aim у меня есть три потока - два для записи массива и один для чтения. И мне нужно это сразу после того, как один из потоков, изменяющих массив, третий поток отображает содержимое массива.

3 ответов


Это не так. Если поток A попадает в mutex_unlock(2) до того, как поток B попал в mutex_lock (2), вы сталкиваетесь с неопределенным поведением. Вы также не должны разблокировать мьютекс другого потока.

на pthread_mutex_lock открыть базовую спецификацию группы говорит так:

Если тип мьютекса PTHREAD_MUTEX_NORMAL [...] Если поток пытается разблокировать мьютекс, который он не заблокировал, или мьютекс, который разблокирован, приводит к неопределенному поведению.


As ответ user562734 говорит ответ " Нет " - вы не можете освободить поток, который был заблокирован другим потоком.

для достижения синхронизации чтения / записи вы хотите, вы должны использовать переменные условия -pthread_cond_wait(), pthread_cond_signal() и связанные с этим функции.


некоторые реализации позволяют блокировать и разблокировать потоки быть иными.

#include <iostream>
#include <thread> 
#include <mutex> 

using namespace std;

mutex m;

void f() {m.lock();   cout << "f: mutex is locked" << endl;}

void g() {m.unlock(); cout << "g: mutex is unlocked" << endl;}

main()
{
      thread tf(f);    /* start f                           */
      tf.join();       /* Wait for f to terminate           */
      thread tg(g);    /* start g                           */
      tg.join();       /* Wait for g to terminate           */
}

эта программа выводит

f: мьютекс заблокирован g: мьютекс разблокирован