线程间共享数据的方法:
1、全局对象;
2、堆对象(动态创建的对象);
任何时刻只允许一个线程对共享资源进行访问的方法:
1、临界区(Critical Section);(首选)
1、全局对象;
2、堆对象(动态创建的对象);
任何时刻只允许一个线程对共享资源进行访问的方法:
1、临界区(Critical Section);(首选)
2、互斥锁(Mutex);
临界区和互斥锁的区别:
Mutex | Critical Section | |
---|---|---|
性能和速度 | 慢(Mutex是内核对象,执行相关函数时,需要用户模式到内核模式的转换) | 快(不是内核对象,直接在用户模式运行) |
能否跨越进程边界 | 能 | 不能 |
一、临界区
要自己将临界区的系统函数分装成一个类来使用。
class MyThreadLock
{
public:
MyThreadLock()
{
InitializeCriticalSection(&m_lock);
};
~MyThreadLock()
{
DeleteCriticalSection(&m_lock);
};
void lockon()
{
EnterCriticalSection(&m_lock);
};
void lockoff()
{
LeaveCriticalSection(&m_lock);
};
private:
CRITICAL_SECTION m_lock;
};
static MyThreadLock threadLock;
线程1
{
MyThreadLock.lockon();
//数据处理。。。
MyThreadLock.lockoff();
}
线程2
{
MyThreadLock.lockon();
//数据处理。。。
MyThreadLock.lockoff();
}
int main()
{
线程1;
线程2;
return 0;
}
二、互斥锁
#include <windows.h>
HANDLE hMutex;
线程1
{
WaitForSingleObject(hMutex, INFINITE);
//数据处理。。。
ReleaseMutex(hMutex);
}
线程2
{
WaitForSingleObject(hMutex, INFINITE);
//数据处理。。。
ReleaseMutex(hMutex);
}
int main()
{
hMutex = CreateMutex(NULL, FALSE, NULL);/第二个参数表示该互斥量是否立刻应用于当前线程,因为我们想在子线程里用,而不是主线程中,所以这里为FALSE
线程1;
线程2;
closeHandle(hMutex);
return 0;
}