C++中的mutex(互斥锁)使用
在做相机采集的时候,往往会用到底层的触发函数,在这个函数里面实现将采集到的相机数据发送出去。并且通常这个函数通常是一个线程。
之前犯的错误是这样:认为凡是用到了线程,就得加上mutex(互斥锁)。由此可能造成线程的堵塞,造成效率低下。
UINT WINAPI SocketThreadProc(LPVOID pParam)
{
Cox320IRCam* pThis = (Cox320IRCam*)pParam;
std::lock_guard<std::mutex> lock(pThis->m_mutex_);
while (pThis->m_hComm_ != INVALID_HANDLE_VALUE)
{
if (pThis->m_fnData_)
pThis->m_fnData_(pThis->m_Context_, pThis->m_Sender_, (void*)&SendData);
}
return 1;
}
这个线程函数里面,所有的数据发送都在while循环这句话里面,并且还在外面上锁,这的就是毫无意义的一步操作了。
这个错误,我有两个盲区:
-
不了解互斥锁的作用
-
什么情况下才是多线程
互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说是为了避免多个线程在某一时刻同时操作一个共享资源。例如线程池中的有多个空闲线程和一个任务队列。任何是一个线程都要使用互斥锁互斥访问任务队列,以避免多个线程同时访问任务队列以发生错乱。
在某一时刻,只有一个线程可以获取互斥锁,在释放互斥锁之前其他线程都不能获取该互斥锁。如果其他线程想要获取这个互斥锁,那么这个线程只能以阻塞方式进行等待。
作者:xy_cpp
来源:CSDN
原文:https://blog.csdn.net/xy_cpp/article/details/81910513
对封装的理解
项目中我需要实现使用OpenGL画3D图形的功能,初版本中我的函数参数表里面出现了OpenGL里面一个句柄,同事为了传参调用这个函数,还需要装一遍OpenGL甚至了解这个参数的具体含义是什么,那就失去了封装的意义了。
使用我们封装函数的人,根本不需要知道我们使用了什么功能,里面的实现是什么,他只需要清楚输入是什么,输出是什么就可以了。
所以封装之前,确认对方的输入和输出就可以了。其他的过程对别人来说都是隐藏着的。