1

我在使用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::mutexComLock 作为私有成员的类的对象,以及一个“libmodbus”上下文数据成员 pToModbusServer...

  • 据我所知,我正在将 1 个对象的地址传递给所有线程,我确保所有线程在运行时都为其地址显示相同的值。而且我没有在任何地方显式地创建另一个 Modbus 包装类的实例。

我的终端显示连续的“锁定后”消息,它们之间没有“modbus_write 之后和睡眠之前”消息,并且匹配的 modbus_write_registers 调用失败并出现各种内存损坏错误(正如非线程安全的库所预期的那样)。

任何帮助,将不胜感激。
:-) 奥马尔

4

1 回答 1

0

在确认 std::mutex 在我的电脑上按预期工作后,唯一剩下的是某种逻辑错误,我错误地执行了解锁。

于 2020-08-05T11:51:31.213 回答