没有合适的资源?快使用搜索试试~ 我知道了~
c++多线程编程之四——线程的同步.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 102 浏览量
2021-11-04
18:07:38
上传
评论
收藏 37KB PDF 举报
温馨提示
试读
11页
c++多线程编程之四——线程的同步.pdf
资源推荐
资源详情
资源评论
八 、 线 程 的 同 步
虽 然 多 线 程 能 给 我 们 带 来 好 处 ,但 是 也 有 不 少 问 题 需 要 解 决 。例 如 ,对 于 像
磁 盘 驱 动 器 这 样 独 占 性 系 统 资 源 ,由 于 线 程 可 以 执 行 进 程 的 任 何 代 码 段 ,且 线 程
的 运 行 是 由 系 统 调 度 自 动 完 成 的 ,具 有 一 定 的 不 确 定 性 ,因 此 就 有 可 能 出 现 两 个
线 程 同 时 对 磁 盘 驱 动 器 进 行 操 作 ,从 而 出 现 操 作 错 误 ;又 例 如 ,对 于 银 行 系 统 的
计 算 机 来 说 ,可 能 使 用 一 个 线 程 来 更 新 其 用 户 数 据 库 ,而 用 另 外 一 个 线 程 来 读 取
数 据 库 以 响 应 储 户 的 需 要 ,极 有 可 能 读 数 据 库 的 线 程 读 取 的 是 未 完 全 更 新 的 数 据
库 , 因 为 可 能 在 读 的 时 候 只 有 一 部 分 数 据 被 更 新 过 。
使 隶 属 于 同 一 进 程 的 各 线 程 协 调 一 致 地 工 作 称 为 线 程 的 同 步 。MFC 提 供 了 多
种 同 步 对 象 , 下 面 我 们 只 介 绍 最 常 用 的 四 种 :
临 界 区 ( CCriticalSection )
事 件 ( CEvent )
互 斥 量 ( CMutex )
信 号 量 ( CSemaphore )
通 过 这 些 类 , 我 们 可 以 比 较 容 易 地 做 到 线 程 同 步 。
A、 使 用 CCriticalSection 类
当 多 个 线 程 访 问 一 个 独 占 性 共 享 资 源 时 , 可 以 使 用 “临 界 区 ”对 象 。 任 一 时 刻
只 有 一 个 线 程 可 以 拥 有 临 界 区 对 象 ,拥 有 临 界 区 的 线 程 可 以 访 问 被 保 护 起 来 的 资
源 或 代 码 段 ,其 他 希 望 进 入 临 界 区 的 线 程 将 被 挂 起 等 待 ,直 到 拥 有 临 界 区 的 线 程
放 弃 临 界 区 时 为 止 , 这 样 就 保 证 了 不 会 在 同 一 时 刻 出 现 多 个 线 程 访 问 共 享 资 源 。
CCriticalSection 类 的 用 法 非 常 简 单 , 步 骤 如 下 :
1. 定 义 CCriticalSection 类 的 一 个 全 局 对 象 ( 以 使 各 个 线 程 均 能 访 问 ) , 如
CCriticalSection critical_section ;
2. 在 访 问 需 要 保 护 的 资 源 或 代 码 之 前 ,调 用 CCriticalSection 类 的 成 员 Lock
( ) 获 得 临 界 区 对 象 :
3. critical_section.Lock();
在 线 程 中 调 用 该 函 数 来 使 线 程 获 得 它 所 请 求 的 临 界 区 。如 果 此 时 没 有 其 它
线 程 占 有 临 界 区 对 象 ,则 调 用 Lock() 的 线 程 获 得 临 界 区 ;否 则 ,线 程 将 被
挂 起 ,并 放 入 到 一 个 系 统 队 列 中 等 待 ,直 到 当 前 拥 有 临 界 区 的 线 程 释 放 了
临 界 区 时 为 止 。
4. 访 问 临 界 区 完 毕 后 , 使 用 CCriticalSection 的 成 员 函 数 Unlock() 来 释 放 临
界 区 :
5. critical_section.Unlock();
再 通 俗 一 点 讲 , 就 是 线 程 A 执 行 到 critical_section.Lock(); 语 句 时 , 如 果
其 它 线 程 (B) 正 在 执 行 critical_section.Lock(); 语 句 后 且 critical_section.
Unlock(); 语 句 前 的 语 句 时 , 线 程 A 就 会 等 待 , 直 到 线 程 B 执 行 完
critical_section. Unlock(); 语 句 , 线 程 A 才 会 继 续 执 行 。
下 面 再 通 过 一 个 实 例 进 行 演 示 说 明 。
例 程 8 MultiThread8
1. 建 立 一 个 基 于 对 话 框 的 工 程 MultiThread8 , 在 对 话 框
IDD_MULTITHREAD8_DIALOG 中 加 入 两 个 按 钮 和 两 个 编 辑 框 控 件 , 两 个
按 钮 的 ID 分 别 为 IDC_WRITEW 和 IDC_WRITED ,标 题 分 别 为 “写 ,W?”和 “写
,D? ”;两 个 编 辑 框 的 ID 分 别 为 IDC_W 和 IDC_D ,属 性 都 选 中 Read-only ;
2. 在 MultiThread8Dlg.h 文 件 中 声 明 两 个 线 程 函 数 :
3. UINT WriteW(LPVOID pParam);
4. UINT WriteD(LPVOID pParam);
5. 使 用 ClassWizard 分 别 给 IDC_W 和 IDC_D 添 加 CEdit 类 变 量 m_ctrlW 和
m_ctrlD ;
6. 在 MultiThread8Dlg.cpp 文 件 中 添 加 如 下 内 容 :
为 了 文 件 中 能 够 正 确 使 用 同 步 类 , 在 文 件 开 头 添 加 :
7. #include "afxmt.h"
定 义 临 界 区 和 一 个 字 符 数 组 ,为 了 能 够 在 不 同 线 程 间 使 用 ,定 义 为 全 局 变
量 :
CCriticalSection critical_section;
char g_Array[10];
添 加 线 程 函 数 :
UINT WriteW(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
critical_section.Lock();
// 锁 定临 界区 ,其 它 线程 遇到 critical_section.Lock(); 语 句
时要 等待
// 直 至执 行 critical_section.Unlock(); 语句
for(int i=0;i<10;i++)
{
g_Array[i]=''W'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
critical_section.Unlock();
return 0;
}
UINT WriteD(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
critical_section.Lock();
// 锁 定临 界区 ,其 它 线程 遇到 critical_section.Lock(); 语 句
时要 等待
// 直 至执 行 critical_section.Unlock(); 语句
for(int i=0;i<10;i++)
{
g_Array[i]=''D'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
critical_section.Unlock();
return 0;
}
8. 分 别 双 击 按 钮 IDC_WRITEW 和 IDC_WRITED , 添 加 其 响 应 函 数 :
剩余10页未读,继续阅读
资源评论
筱筱笎琞
- 粉丝: 8
- 资源: 15万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功