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

Другие вопросы по тегам