возникли проблемы с использованием std :: mutex - PullRequest
1 голос
/ 05 августа 2020

У меня проблемы с использованием 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 Ответ

0 голосов
/ 05 августа 2020

после подтверждения того, что std :: mutex работает должным образом на моем p c, единственное, что осталось, это какая-то логическая ошибка, при которой я выполняю разблокировку по ошибке.

...