Блокировка мьютекса в одном потоке и разблокировка его в другом
извините за мой английский - я русский.
будет ли этот код корректным и переносимым?
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: мьютекс разблокирован