您的位置:首页 > 编程语言

多线程编程——线程间共享数据(临界区&互斥锁)

2018-01-14 13:57 274 查看
线程间共享数据的方法:

1、全局对象;

2、堆对象(动态创建的对象);

任何时刻只允许一个线程对共享资源进行访问的方法:

1、临界区(Critical Section);(首选)

2、互斥锁(Mutex);

临界区和互斥锁的区别:

 MutexCritical 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程编程