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



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

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

问题分析

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

问题一

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

问题二

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

问题三

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


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




本专栏目录

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

1 0
原创粉丝点击