如何实现线程同步
来源:互联网 发布:天蝎网络第三季百度云 编辑:程序博客网 时间:2024/04/26 05:00
1、什么是线程同步
线程同步是指在同一进程中的多个线程相互协调工作达到一致性。
2、临界区对象是指当用户使用某个线程访问共享资源时,必须使代码段独享该资源,不允许其他线程程序访问该资源。就好比用户在试衣间试衣服,其他用户不能使用
1)使用API函数操作临界区
有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。
临界区在使用时以CRITICAL_SECTION结构对象保护共享资源,并分别用EnterCriticalSection()和LeaveCriticalSection()函数去标识和释放一个临界区。所用到的CRITICAL_SECTION结构对象必须经过InitializeCriticalSection()的初始化后才能使用,而且必须确保所有线程中的任何试图访问此共享资源的代码都处在此临界区的保护之下。否则临界区将不会起到应有的作用,共享资源依然有被破坏的可能。
下 面通过一段代码展示了临界区在保护多线程访问的共享资源中的作用。通过两个线程来分别对全局变量g_cArray[10]进行写入操作,用临界区结构对象g_cs来保持线程的同步,并在开启线程前对其进行初始化。为了使实验效果更加明显,体现出临界区的作用,在线程函数对共享资源g_cArray[10]的写入时,以Sleep()函数延迟1毫秒,使其他线程同其抢占CPU的可能性增大。如果不使用临界区对其进行保护,则共享资源数据将被破坏(参见图1(a)所示计算结果),而使用临界区对线程保持同步后则可以得到正确的结果(参见图1(b)所示计算结果)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// 临界区结构对象
CRITICAL_SECTION g_cs;
// 共享资源
char
g_cArray[10];
UINT
ThreadProc10(
LPVOID
pParam)
{
// 进入临界区
EnterCriticalSection(&g_cs);
// 对共享资源进行写入操作
for
(
int
i = 0; i < 10; i++)
{
g_cArray[i] = a;
Sleep(1);
}
// 离开临界区
LeaveCriticalSection(&g_cs);
return
0;
}
UINT
ThreadProc11(
LPVOID
pParam)
{
// 进入临界区
EnterCriticalSection(&g_cs);
// 对共享资源进行写入操作
for
(
int
i = 0; i < 10; i++)
{
g_cArray[10 - i - 1] = b;
Sleep(1);
}
// 离开临界区
LeaveCriticalSection(&g_cs);
return
0;
}
……
void
CSample08View::OnCriticalSection()
{
// 初始化临界区
InitializeCriticalSection(&g_cs);
// 启动线程
AfxBeginThread(ThreadProc10, NULL);
AfxBeginThread(ThreadProc11, NULL);
// 等待计算完毕
Sleep(300);
// 报告计算结果
CString sResult = CString(g_cArray);
AfxMessageBox(sResult);
}
0 0
- 如何实现线程同步
- Java如何实现线程同步
- Java线程如何实现同步?
- 如何实现线程的同步
- 线程如何实现同步和通讯
- java如何实现线程的安全:线程的同步机制
- 列出线程的实现方式?如何实现同步?
- 如何线程的同步
- android线程如何同步
- 在Qt中如何实现QThread线程同步QFtp
- objective-c中是如何实现线程同步的?
- 如何采用不加锁的方式实现线程同步
- objective-c中是如何实现线程同步的?
- 11.7-全栈Java笔记:如何实现线程同步
- java多线程有几种实现方法?线程之间如何同步
- 事件实现线程同步
- 信号量实现线程同步
- 线程同步实现
- screen命令总结
- 如何在Cocos2D游戏中实现A*寻路算法(六)
- 随机算法
- 01.SpringMVC基础【孔浩SpringMVC视频教程】学习笔记
- Web Service单元测试工具实例介绍之SoapUI
- 如何实现线程同步
- 20151122 ocp 052(01-10)解析
- Discontinuous Reception (DRX) in RRC_IDLE: Part 2
- 并行计算-学习笔记1
- java过滤器---一异步处理
- 用Adobe Reader的“朗读”功能实现“少林修女GPS”语音提示
- 黑马程序员日记-14
- OO技术三大特点
- Unity shader中的法线详解