У меня проблемы с использованием 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 завершается ошибкой с различными ошибками повреждения памяти (как и ожидалось от библиотеки, которая не является потокобезопасной).
Любая помощь будет принята с благодарностью. :-) омер