码迷,mamicode.com
首页 > 编程语言 > 详细

C++拾遗--多线程:主线程与子线程的同步

时间:2015-02-27 13:32:57      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:多线程   同步   异步   主线程   子线程   

                      C++拾遗--多线程:主线程与子线程的同步

前言

    在多线程编程时,有时是需要要求主线程与子线程同步的。

正文

程序演示

下面的一个例子,演示了主线程与子线程之间的同步问题。

程序描述:

在主线程中,有一整型变量count,初始化为0。主线程把count的地址传递给开启的子线程,子线程打印获取的值,随后主线程递增count的值,再次开启另一个子线程,传递count的地址……

#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <Windows.h>
#define Thread_NUM 20
void thread_go(void *p)
{
	Sleep(100);     //do some work
	int i = *(int*)p;
	Sleep(100);     //do some work
	printf("线程%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 work
		WaitForSingleObject(handles[i], INFINITE);   //开启这行代码也可实现主线程与子线程同步
		count++;     //在子线程获取这个值之前,主线程很可能对它进行了修改,从而某次报数被跳过。
	}
	//永久等待所有子线程结束
	WaitForMultipleObjects(Thread_NUM, handles, TRUE, INFINITE);
	getchar();
	return 0;
}
运行

技术分享

这个运行结果是特地挑选的,因为它暴露了所有的问题:

  1. 理论上报数结果是从0连续到19。可运行结果中有的数被跳过了,如1,15。
  2. 有的数被重复报数,如14,16。
  3. 为何会出现20?这本不应该。

问题分析

针对这三个问题详细分析出现的原因:

问题一

有的数被跳过。这在代码的count++;这句后有详细解释。看下代码注释即可明白。

问题二

有的数被重复。这个原因也和上一个问题原因一样:上一个线程在获取count值之前,count的值就被主线程改了,从而当上一个线程获取count的值时,极有可能它获取的值大小和下一个子线程获取的是同一个值。于是重复了。

问题三

原因很多,其中一个可以是:最后i和count的大小都是20,循环本应结束,主线程却被打断。若某子线程若还未保存count的值,子线程保存的就是count最后的值20。


后续文章,通过相应方法,实现主子线程同步。




本专栏目录

所有内容的目录

C++拾遗--多线程:主线程与子线程的同步

标签:多线程   同步   异步   主线程   子线程   

原文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/43966317

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!