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

线程间共享数据的方法:
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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值