多线程编程——线程间共享数据(临界区&互斥锁)
2018-01-14 13:57
274 查看
线程间共享数据的方法:
1、全局对象;
2、堆对象(动态创建的对象);
任何时刻只允许一个线程对共享资源进行访问的方法:
1、临界区(Critical Section);(首选)
2、互斥锁(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;
}
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;
}
相关文章推荐
- 多线程并发库高级应用 之 多个线程之间共享数据的方式探讨
- Linux C 多线程【3】--传递参数&共享进程数据
- 【C/C++多线程编程之十】pthread线程私有数据
- 【转】JAVA 并发编程-多个线程之间共享数据
- java多线程与线程并发四:线程范围内的共享数据
- JAVA 并发编程-多个线程之间共享数据(六)
- JAVA 并发编程-多个线程之间共享数据(六)
- 【多线程】-线程范围内共享数据的两种方式
- 多线程和并发库应用七-线程间数据共享2
- 【Java多线程与并发库】06 多个线程之间共享数据的方式探讨
- java多线程编程之向线程传递数据的三种方法
- 多线程并发库高级应用 之 线程范围内共享数据
- 多线程一共就俩问题:1.线程安全(访问共享数据) 2.线程通信(wait(),notify())
- Android多线程研究(5)——线程之间共享数据
- 高级并发编程之 线程范围内安全共享数据(使用Map方式)
- java多线程编程之从线程返回数据的两种方法
- 多线程之计算文件单词数量-线程参数-互斥锁访问共享区
- 多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)
- Android多线程研究(5)——线程之间共享数据
- 多线程_线程范围内数据共享