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; }运行
这个运行结果是特地挑选的,因为它暴露了所有的问题:
有的数被跳过。这在代码的count++;这句后有详细解释。看下代码注释即可明白。
有的数被重复。这个原因也和上一个问题原因一样:上一个线程在获取count值之前,count的值就被主线程改了,从而当上一个线程获取count的值时,极有可能它获取的值大小和下一个子线程获取的是同一个值。于是重复了。
原因很多,其中一个可以是:最后i和count的大小都是20,循环本应结束,主线程却被打断。若某子线程若还未保存count的值,子线程保存的就是count最后的值20。
后续文章,通过相应方法,实现主子线程同步。
本专栏目录
原文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/43966317