возникли проблемы с использованием std::mutex
У меня проблемы с использованием std::mutex
( cpp) для сериализации доступа к общему ресурсу (мне нужно использовать libmodbus, который не является потокобезопасным. В настоящее время я пытаюсь сериализовать доступ к функции modbus_write_registers, поместив mutex.lock()
заявление перед ним. Я освобождаю мьютекс ближе к концу моей функции.)
суть моей проблемы в том, что похоже, что несколько потоков могут одновременно получить блокировку на мьютексе.
Я пробовал несколько разных версий компилятора, пробовал использовать std::lock_guard
результаты такие же.
вот некоторые технические характеристики:
gcc 7.4.0 ( 6.3.0 , 5.4.0)
libstdc++.so.6.0.26
building with cmake ,
c++ version 14 (set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14"))
какой-то код:
моя функция записи
std::thread::id this_id = std::this_thread::get_id();
m.lock()
std::cout << "@@@@@@@@@@ FfrModBusClient::setRegistersOnePacket after lock tid " << this_id << std::endl;
ModbusRetCode = modbus_write_registers(pToModbusServer, AddressToWrite, RegsToWrite, RegsValues);
std::cout << "FfrModBusClient::setRegistersOnePacket after modbus_write & before sleep, id " << this_id << std::endl;
мой основной:
struct TestThreadParameters
{
int Id;
FfrModBusClient * pSharedModbusClient;
int Port;
std::string Ip;
};
void TestInThread(const TestThreadParameters Parameters)
.
.
.
void main :
TestThreadParameters TTP;
TTP.Ip = IPAddress;
TTP.Port = Port;
TTP.pSharedModbusClient = &ModbusClientObject;
std::thread a1(TestInThread,TTP);
.
.
std::thread a9(TestInThread,TTP);
a1.join()....
ModbusClientObject - это объект класса, имеющий
std::mutex
ComLock как частный член и элемент данных контекста libmodbus pToModbusServer...насколько мне известно, я передаю адрес 1 объекта всем потокам, я убедился, что все потоки показывают одно и то же значение для его адреса во время выполнения. и я нигде явно не создаю другой экземпляр класса-оболочки Modbus.
мой терминал показывает последовательные сообщения "после блокировки" без сообщений "после modbus_write и перед сном" между ними и соответствующий вызов modbus_write_registers завершается с ошибкой с различными ошибками повреждения памяти (как и ожидалось от библиотеки, которая не является поточно-ориентированной).
Любая помощь будет оценена.
:-) омер
1 ответ
После подтверждения того, что std::mutex работает на моем компьютере должным образом, единственное, что осталось, - это какая-то логическая ошибка, из-за которой я выполняю разблокировку по ошибке.