我在使用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 调用失败并出现各种内存损坏错误(正如非线程安全的库所预期的那样)。
任何帮助,将不胜感激。
:-) 奥马尔