本文对ACE使用的介绍不多,因网上ACE的资料很多,故不进行介绍,而仅使用
当使用多线程进行开发工作的时候,必然会涉及到对公有数据的读写处理。
如果多个线程同时访问某个公有变量,若大部分对其写操作,仅少部分对其读操作,则最好使用互斥量对此变量进行保护;若大部分对其读操作,少部分对其写操作,则最好使用读写锁对此变量进行保护。
使用1个线程触发另外1个或者多个线程使用最广泛的是条件锁。即某些线程因当前条件不满足使用条件锁进行休眠,还有1个线程通过接收用户的操作给条件锁发送信号,使其他某个线程由休眠转为运行状态。
多线程死锁。有线程PA、PB,有互斥量LA、LB,线程PA开始运行时首先获取LA,线程PB开始运行时首先获取LB,然后线程PA需要获取LB,而线程PB需要获取LA,此情况下将会产生死锁。有线程PA,有互斥量LA,线程开始运行时首先获取了LA,后期因某些操作又需要获取获取LA,这种情况下基于操作系统的不同而得到的结果不同,如在windows操作系统下不会产生死锁,而在linux系统下则会产生死锁。读写锁相反。
如何在多线程开发中降低多线程并发运行的等待时间,提高线程的执行效率是1个很大的问题?在C++23种设计模式中好像未提到多线程的具体设计方法。
方法1:以空间换取时间,降低线程之间的关联性,使每个线程获取到锁的时间、占用锁的时间尽可能的短
ACE_Thread_Mutex mux;
std::string tmp;
list<std::string> obj;
{
ACE_Guard< ACE_Thread_Mutex> gdSync(mux);
tmp = g_data;
}
方法2:还没有想出来
多线程的流水线控制(基于条件锁):此例仅1个线程触发另外1个的线程代码核心触发部分,可对其进行优化
代码1:公共部分
ACE_Thread_Mutex m_cond_mux;
ACE_Condition<ACE_Thread_Mutex> m_cond(m_cond_mux);
代码2:等待部分
while(1)
{
if(!条件)
{
m_cond_mux.acquire();
m_cond.wait();
m_cond_mux.release();
}
//事件处理
}
代码3:触发部分
m_cond_mux.acquire();
if(条件)
{
m_cond.signal();
}
m_cond_mux.release();