收藏 分享(赏)

C语言多线程编程实例.pdf

上传人:精品资料 文档编号:10560805 上传时间:2019-11-29 格式:PDF 页数:6 大小:98.40KB
下载 相关 举报
C语言多线程编程实例.pdf_第1页
第1页 / 共6页
C语言多线程编程实例.pdf_第2页
第2页 / 共6页
C语言多线程编程实例.pdf_第3页
第3页 / 共6页
C语言多线程编程实例.pdf_第4页
第4页 / 共6页
C语言多线程编程实例.pdf_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、linux下 C语 言 多 线 程 编 程 实 例2007年 11月 29日 星 期 四 10:39学 东 西 , 往 往 实 例 才 是 最 让 人 感 兴 趣 的 , 老 是 学 基 础 理 论 , 不 动 手 , 感 觉 没 有 成 就 感 , 呵 呵 。下 面 先 来 一 个 实 例 。 我 们 通 过 创 建 两 个 线 程 来 实 现 对 一 个 数 的 递 加 。或 许 这 个 实 例 没 有 实 际 运 用 的 价 值 , 但 是 稍 微 改 动 一 下 , 我 们 就 可 以 用 到 其 他 地 方 去 拉 。下 面 是 我 们 的 代 码 :/*thread_example

2、.c : c multiple thread programming in linux*author : falcon*E-mail : */#include #include #include #include #define MAX 10pthread_t thread2;pthread_mutex_t mut;int number=0, i;void *thread1()printf (“thread1 : Im thread 1n“);for (i = 0; i MAX; i+) printf(“thread1 : number = %dn“,number);pthread_mutex

3、_lock(number+;pthread_mutex_unlock(sleep(2);printf(“thread1 :主 函 数 在 等 我 完 成 任 务 吗 ? n“);pthread_exit(NULL);void *thread2() printf(“thread2 : Im thread 2n“);for (i = 0; i MAX; i+) printf(“thread2 : number = %dn“,number);pthread_mutex_lock(number+;pthread_mutex_unlock(sleep(3);printf(“thread2 :主 函 数

4、在 等 我 完 成 任 务 吗 ? n“);pthread_exit(NULL);void thread_create(void) int temp;memset( /comment1/*创 建 线 程 */if(temp = pthread_create(else printf(“线 程 1 被 创 建 n“);if(temp = pthread_create(else printf(“线 程 2 被 创 建 n“);void thread_wait(void) /*等 待 线 程 结 束 */if(thread0 !=0) /comment4pthread_join(thread0,NUL

5、L);printf(“线 程 1 已 经 结 束 n“);if(thread1 !=0) /comment5pthread_join(thread1,NULL);printf(“线 程 2 已 经 结 束 n“);int main()/*用 默 认 属 性 初 始 化 互 斥 锁 */pthread_mutex_init(printf(“我 是 主 函 数 哦 , 我 正 在 创 建 线 程 , 呵 呵 n“);thread_create();printf(“我 是 主 函 数 哦 , 我 正 在 等 待 线 程 完 成 任 务 阿 , 呵 呵 n“);thread_wait();return

6、 0;下 面 我 们 先 来 编 译 、 执 行 一 下引 文 :falconfalcon:/program/c/code/ftp$ gcc -lpthread -o thread_example thread_example.cfalconfalcon:/program/c/code/ftp$ ./thread_example我 是 主 函 数 哦 , 我 正 在 创 建 线 程 , 呵 呵线 程 1 被 创 建线 程 2 被 创 建我 是 主 函 数 哦 , 我 正 在 等 待 线 程 完 成 任 务 阿 , 呵 呵thread1 : Im thread 1thread1 : number

7、 = 0thread2 : Im thread 2thread2 : number = 1thread1 : number = 2thread2 : number = 3thread1 : number = 4thread2 : number = 5thread1 : number = 6thread1 : number = 7thread2 : number = 8thread1 : number = 9thread2 : number = 10thread1 :主 函 数 在 等 我 完 成 任 务 吗 ?线 程 1 已 经 结 束thread2 :主 函 数 在 等 我 完 成 任 务

8、吗 ?线 程 2 已 经 结 束实 例 代 码 里 头 的 注 释 应 该 比 较 清 楚 了 吧 , 下 面 我 把 网 路 上 介 绍 上 面 涉 及 到 的 几 个 函 数 和 变 量 给 引用 过 来 。引 文 :线 程 相 关 操 作一 pthread_tpthread_t在 头 文 件 /usr/include/bits/pthreadtypes.h中 定 义 :typedef unsigned long int pthread_t;它 是 一 个 线 程 的 标 识 符 。二 pthread_create函 数 pthread_create 用 来 创 建 一 个 线 程 , 它

9、 的 原 型 为 :extern int pthread_create _P (pthread_t *_thread, _const pthread_attr_t*_attr,void *(*_start_routine) (void *), void *_arg);第 一 个 参 数 为 指 向 线 程 标 识 符 的 指 针 , 第 二 个 参 数 用 来 设 置 线 程 属 性 , 第 三 个 参 数 是 线 程 运行 函 数 的 起 始 地 址 , 最 后 一 个 参 数 是 运 行 函 数 的 参 数 。 这 里 , 我 们 的 函 数 thread不 需 要 参 数 ,所 以 最

10、后 一 个 参 数 设 为 空 指 针 。 第 二 个 参 数 我 们 也 设 为 空 指 针 , 这 样 将 生 成 默 认 属 性 的 线 程 。 对线 程 属 性 的 设 定 和 修 改 我 们 将 在 下 一 节 阐 述 。 当 创 建 线 程 成 功 时 , 函 数 返 回 0, 若 不 为 0 则 说 明创 建 线 程 失 败 , 常 见 的 错 误 返 回 代 码 为 EAGAIN和 EINVAL。 前 者 表 示 系 统 限 制 创 建 新 的 线 程 , 例如 线 程 数 目 过 多 了 ; 后 者 表 示 第 二 个 参 数 代 表 的 线 程 属 性 值 非 法 。 创

11、建 线 程 成 功 后 , 新 创 建 的 线程 则 运 行 参 数 三 和 参 数 四 确 定 的 函 数 , 原 来 的 线 程 则 继 续 运 行 下 一 行 代 码 。三 pthread_join pthread_exit函 数 pthread_join用 来 等 待 一 个 线 程 的 结 束 。 函 数 原 型 为 :extern int pthread_join _P (pthread_t _th, void *_thread_return);第 一 个 参 数 为 被 等 待 的 线 程 标 识 符 , 第 二 个 参 数 为 一 个 用 户 定 义 的 指 针 , 它 可 以

12、 用 来 存 储 被等 待 线 程 的 返 回 值 。 这 个 函 数 是 一 个 线 程 阻 塞 的 函 数 , 调 用 它 的 函 数 将 一 直 等 待 到 被 等 待 的 线 程结 束 为 止 , 当 函 数 返 回 时 , 被 等 待 线 程 的 资 源 被 收 回 。 一 个 线 程 的 结 束 有 两 种 途 径 , 一 种 是 象 我们 上 面 的 例 子 一 样 , 函 数 结 束 了 , 调 用 它 的 线 程 也 就 结 束 了 ; 另 一 种 方 式 是 通 过 函 数pthread_exit来 实 现 。 它 的 函 数 原 型 为 :extern void pthr

13、ead_exit _P (void *_retval) _attribute_ (_noreturn_);唯 一 的 参 数 是 函 数 的 返 回 代 码 , 只 要 pthread_join中 的 第 二 个 参 数 thread_return不 是NULL, 这 个 值 将 被 传 递 给 thread_return。 最 后 要 说 明 的 是 , 一 个 线 程 不 能 被 多 个 线 程 等 待 , 否则 第 一 个 接 收 到 信 号 的 线 程 成 功 返 回 , 其 余 调 用 pthread_join的 线 程 则 返 回 错 误 代 码 ESRCH。在 这 一 节 里 ,

14、 我 们 编 写 了 一 个 最 简 单 的 线 程 , 并 掌 握 了 最 常 用 的 三 个 函 数 pthread_create,pthread_join和 pthread_exit。 下 面 , 我 们 来 了 解 线 程 的 一 些 常 用 属 性 以 及 如 何 设 置 这 些 属 性 。互 斥 锁 相 关互 斥 锁 用 来 保 证 一 段 时 间 内 只 有 一 个 线 程 在 执 行 一 段 代 码 。一 pthread_mutex_init函 数 pthread_mutex_init用 来 生 成 一 个 互 斥 锁 。 NULL 参 数 表 明 使 用 默 认 属 性 。

15、如 果 需 要 声 明 特定 属 性 的 互 斥 锁 , 须 调 用 函 数 pthread_mutexattr_init。 函 数 pthread_mutexattr_setpshared和 函 数 pthread_mutexattr_settype用 来 设 置 互 斥 锁 属 性 。 前 一 个 函 数 设 置 属 性 pshared, 它 有两 个 取 值 , PTHREAD_PROCESS_PRIVATE和 PTHREAD_PROCESS_SHARED。 前 者 用 来 不 同 进 程 中 的 线程 同 步 , 后 者 用 于 同 步 本 进 程 的 不 同 线 程 。 在 上 面

16、的 例 子 中 , 我 们 使 用 的 是 默 认 属 性PTHREAD_PROCESS_ PRIVATE。 后 者 用 来 设 置 互 斥 锁 类 型 , 可 选 的 类 型 有 PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、 PTHREAD_MUTEX_RECURSIVE和 PTHREAD _MUTEX_DEFAULT。 它 们 分别 定 义 了 不 同 的 上 所 、 解 锁 机 制 , 一 般 情 况 下 , 选 用 最 后 一 个 默 认 属 性 。二 pthread_mutex_lock pthread_mutex_unlock pth

17、read_delay_nppthread_mutex_lock声 明 开 始 用 互 斥 锁 上 锁 , 此 后 的 代 码 直 至 调 用 pthread_mutex_unlock为 止 , 均 被 上 锁 , 即 同 一 时 间 只 能 被 一 个 线 程 调 用 执 行 。 当 一 个 线 程 执 行 到 pthread_mutex_lock处 时 , 如 果 该 锁 此 时 被 另 一 个 线 程 使 用 , 那 此 线 程 被 阻 塞 , 即 程 序 将 等 待 到 另 一 个 线 程 释 放 此 互斥 锁 。注 意 :1 需 要 说 明 的 是 , 上 面 的 两 处 sleep不

18、 光 是 为 了 演 示 的 需 要 , 也 是 为 了 让 线 程 睡 眠 一 段 时 间 , 让线 程 释 放 互 斥 锁 , 等 待 另 一 个 线 程 使 用 此 锁 。 下 面 的 参 考 资 料 1里 头 说 明 了 该 问 题 。 但 是 在 linux下 好 像 没 有 pthread_delay_np 那 个 函 数 ( 我 试 了 一 下 , 提 示 没 有 定 义 该 函 数 的 引 用 ) , 所 以 我用 了 sleep 来 代 替 , 不 过 参 考 资 料 2中 给 出 另 一 种 方 法 , 好 像 是 通 过 pthread_cond_timedwait来 代

19、 替 , 里 头 给 出 了 一 种 实 现 的 办 法 。2 请 千 万 要 注 意 里 头 的 注 释 comment1-5, 那 是 我 花 了 几 个 小 时 才 找 出 的 问 题 所 在 。如 果 没 有 comment1和 comment4,comment5,将 导 致 在 pthread_join的 时 候 出 现 段 错 误 , 另 外 ,上 面 的 comment2和 comment3是 根 源 所 在 , 所 以 千 万 要 记 得 写 全 代 码 。 因 为 上 面 的 线 程 可 能 没 有创 建 成 功 , 导 致 下 面 不 可 能 等 到 那 个 线 程 结 束

20、 , 而 在 用 pthread_join的 时 候 出 现 段 错 误 ( 访 问了 未 知 的 内 存 区 ) 。 另 外 , 在 使 用 memset的 时 候 , 需 要 包 含 string.h头 文 件 哦参 考 资 料 :1。 Linux下 的 多 线 程 编 程2。 pthread_delay_np( 这 里 头 有 个 关 于 posix条 件 变 量 的 例 子 )3。 pthread_join和 段 错 误 ( 非 常 感 谢 这 里 头 的 哥 们 , 千 万 要 看 哦 )4。 posix线 程 编 程 指 南 学 习 linux下 多 线 程 , 不 看 这 个 你 会 后 悔 的 http:/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报