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

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

前言

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

正文

程序演示

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

程序描述:

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

#include 
#include 
#include 
#include 
#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;
}
运行

C++拾遗--多线程:主线程与子线程的同步_第1张图片

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

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

问题分析

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

问题一

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

问题二

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

问题三

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


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




本专栏目录

  • C++拾遗 目录
所有内容的目录
  • CCPP Blog 目录

你可能感兴趣的:(C++拾遗,C++拾遗)