C++ 之 经典线程同步案例之多线程(五)

首先在此感谢 MoreWindows 秒杀多线程面试题系列让我成长和学习,同时也借鉴了很多优秀观点和示例!

在此也借鉴MoreWindows案例加以说明:

 

程序描述:

主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量。

要求:

1.子线程输出的线程序号不能重复。

2.全局变量的输出必须递增。

下面画了个简单的示意图:

分析下这个问题的考察点,主要考察点有二个:

1.主线程创建子线程并传入一个指向变量地址的指针作参数,由于线程启动须要花费一定的时间,所以在子线程根据这个指针访问并保存数据前,主线程应等待子线程保存完毕后才能改动该参数并启动下一个线程。这涉及到主线程与子线程之间的同步

2.子线程之间会互斥的改动和输出全局变量。要求全局变量的输出必须递增。这涉及到各子线程间的互斥

 

-----------------------------------------------OK-------------------------------------------------------------------

文字很模糊可以看图解说明:

其实与前面的几篇文章差异并不是很大!无非使用下面函数来传参而已,前面也已经说到了:

涉及到主线程与子线程之间的同步:同步序号因为一个要读一个要取!

涉及到各子线程间的互斥:读取2时候主线程好子线程都可以操作序号!

 

使用函数参数说明:

/*
 经典多线程同步(五)

 unsigned long _beginthreadex( void *security, unsigned stack_size, unsigned ( __stdcall *start_address )( void * ), void *arglist, unsigned initflag, unsigned *thrdaddr );

 //第1个参数:安全属性,NULL为默认安全属性
 //第2个参数:指定线程堆栈的大小。如果为0,则线程堆栈大小和创建它的线程的相同。一般用0
 //第3个参数:指定线程函数的地址,也就是线程调用执行的函数地址(用函数名称即可,函数名称就表示地址)
 //第4个参数:传递给线程的参数的指针,可以通过传入对象的指针,在线程函数中再转化为对应类的指针
 //第5个参数:线程初始状态,0:立即运行;CREATE_SUSPEND:suspended(悬挂)
 //第6个参数:用于记录线程ID的地址

*/

 

验证代码架构:

#include <iostream>
#include <Windows.h>
#include <process.h>
using namespace std;
unsigned __stdcall CreateThread(PVOID start_address);
const int ThreadNumber = 10;//创建线程数量
long GblNum;//全局资源


int main()
{
	HANDLE hEP[ThreadNumber];

		for (int i = 0;i <ThreadNumber;)
		{
			hEP[i]=(HANDLE)_beginthreadex( NULL, 0,CreateThread , &i, 0, NULL );
			i++;
		}
		//WaitForMultipleObjects函数说明  
		WaitForMultipleObjects(ThreadNumber, hEP,true, INFINITE );  
	 
	system("pause");
	return 0;
}

unsigned __stdcall CreateThread(PVOID start_address)
{
	/*int Num = (int)(int *)start_address;*/  //按照提示强制转换为int 线程编号有问题?
	int Num = *(int *)start_address;//传start_address 为地址,对地址取*为值
	GblNum++;
	
	cout<<"线程编号:"<<Num<<"全局数量"<<GblNum<<endl;
	return 0;
}


运行效果1:

运行效果2:

 

解决手段:Windows平台下各种手段包括关键段,事件,互斥量,信号量等等来解决这个问题!(下面文章将会依次使用关键段,事件,互斥量,信号量来达到我们的目的!也将会具体讨论每一种的优缺点!)

 

期待将持续更新!

syw_selfimpr新浪微博地址: http://weibo.com/u/2945271402

注:以上在VS2010 正常编译!

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值