C++拾遗--多线程:主线程与子线程的同步
来源:互联网 发布:剑三脸型数据下载 编辑:程序博客网 时间:2024/05/17 02:21
C++拾遗--多线程:主线程与子线程的同步
前言
在多线程编程时,有时是需要要求主线程与子线程同步的。
正文
程序演示
下面的一个例子,演示了主线程与子线程之间的同步问题。
程序描述:
在主线程中,有一整型变量count,初始化为0。主线程把count的地址传递给开启的子线程,子线程打印获取的值,随后主线程递增count的值,再次开启另一个子线程,传递count的地址……
#include <stdio.h>#include <stdlib.h>#include <process.h>#include <Windows.h>#define Thread_NUM 20void thread_go(void *p){Sleep(100); //do some workint i = *(int*)p;Sleep(100); //do some workprintf("线程%d,报数%d\n", GetCurrentThreadId(), i);}int main(void){printf("******主线程与子线程的同步问题演示***by David***\n");HANDLE handles[Thread_NUM];int count = 0;for (int i = 0; i < Thread_NUM; i++){handles[i] = _beginthread(thread_go, 0, &count);Sleep(100); //do some workWaitForSingleObject(handles[i], INFINITE); //开启这行代码也可实现主线程与子线程同步count++; //在子线程获取这个值之前,主线程很可能对它进行了修改,从而某次报数被跳过。}//永久等待所有子线程结束WaitForMultipleObjects(Thread_NUM, handles, TRUE, INFINITE);getchar();return 0;}运行
这个运行结果是特地挑选的,因为它暴露了所有的问题:
- 理论上报数结果是从0连续到19。可运行结果中有的数被跳过了,如1,15。
- 有的数被重复报数,如14,16。
- 为何会出现20?这本不应该。
问题分析
针对这三个问题详细分析出现的原因:
问题一
有的数被跳过。这在代码的count++;这句后有详细解释。看下代码注释即可明白。
问题二
有的数被重复。这个原因也和上一个问题原因一样:上一个线程在获取count值之前,count的值就被主线程改了,从而当上一个线程获取count的值时,极有可能它获取的值大小和下一个子线程获取的是同一个值。于是重复了。
问题三
原因很多,其中一个可以是:最后i和count的大小都是20,循环本应结束,主线程却被打断。若某子线程若还未保存count的值,子线程保存的就是count最后的值20。
后续文章,通过相应方法,实现主子线程同步。
本专栏目录
- C++拾遗 目录
所有内容的目录
- CCPP Blog 目录
1 0
- C++拾遗--多线程:主线程与子线程的同步
- 多线程之主线程与子线程
- Python 多线程,主线程与子线程
- C#/.NET主线程与子线程之间的关系
- python多线程(等待)主线程和子线程的同步执行
- 主线程与子线程的问题
- 主线程与子线程的关系
- Android的主线程与子线程
- java 多线程之主线程与子线程
- 多线程,主线程与子线程的通信Handler Message sendmessage与handlemessage obtainmessage
- 主线程和子线程的同步控制
- 主线程和子线程的同步控制
- 主线程 和子线程的同步控制
- android多线程,子线程与主线程的通信,下载的文件的显示
- 主线程 子线程 同步问题
- 多线程实现闹钟功能以及主线程与子线程的关系说明
- 多线程编程子线程访问主线程的界面
- WPF 多线程---- 子线程操作界面主线程的元素
- Android中ListView的适配器中getView()被重复调用的原因及解决方案.
- Javascript中的this
- 关于Xcode不显示中文解决方案
- CentOS6.4+Oracle11.2.0.4安装(单实例ASM)
- pat1012 The Best Rank
- C++拾遗--多线程:主线程与子线程的同步
- 业务数据备份功能
- 寻路算法基础研究
- swift UI专项训练14 ImageView图像视图
- 莫利定理:UVa 11178 Morley's Theorem
- UVa 511 - Do You Know the Way to San Jose? [STL应用]
- [LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql)
- C++ private成员变量作用域的扩展
- 半透明的实现