秒杀多线程第四篇 一个经典的多线程同步问题

秒杀多线程第四篇 一个经典的多线程同步问题

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

上一篇《秒杀多线程第三篇原子操作 Interlocked系列函数》中介绍了原子操作在多进程中的作用,如今来个复杂点的。这个问题涉及到线程的同步和相互排斥,是一道很有代表性的多线程同步问题,假设能将这个问题搞清楚,那么对多线程同步也就打下了良好的基础。

 

程序描写叙述:

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

要求:

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

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

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

秒杀多线程第四篇 一个经典的多线程同步问题

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

1.主线程创建子线程并传入一个指向变量地址的指针作參数,因为线程启动需要花费一定的时间,所以在子线程依据这个指针訪问并保存数据前,主线程应等待子线程保存完成后才干修改该參数并启动下一个线程。这涉及到主线程与子线程之间的同步

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

 

以下列出这个程序的基本框架,能够在此代码基础上进行修改和验证。

//经典线程同步相互排斥问题
#include <stdio.h>
#include <process.h>
#include <windows.h>

long g_nNum; //全局资源
unsigned int __stdcall Fun(void *pPM); //线程函数
const int THREAD_NUM = 10; //子线程个数

int main()
{
	g_nNum = 0;
	HANDLE  handle[THREAD_NUM];
	
	int i = 0;
	while (i < THREAD_NUM) 
	{
		handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL);
		i++;//等子线程接收到參数时主线程可能改变了这个i的值
	}
	//保证子线程已所有执行结束
	WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);  
	return 0;
}

unsigned int __stdcall Fun(void *pPM)
{
//因为创建线程是要一定的开销的,所以新线程并不能第一时间运行到这来
	int nThreadNum = *(int *)pPM; //子线程获取參数
	Sleep(50);//some work should to do
	g_nNum++;  //处理全局资源
	Sleep(0);//some work should to do
	printf("线程编号为%d  全局资源值为%d\n", nThreadNum, g_nNum);
	return 0;
}

执行结果能够參考下列图示,强烈建议读者亲自试一试。

1

秒杀多线程第四篇 一个经典的多线程同步问题

2

秒杀多线程第四篇 一个经典的多线程同步问题

3

秒杀多线程第四篇 一个经典的多线程同步问题

能够看出,执行结果全然是混乱和不可预知的。本系列将会运用Windows平台下各种手段包含关键段,事件,相互排斥量,信号量等等来解决问题并作一份全面的总结,敬请关注。

 

秒杀多线程第五篇 经典线程同步 关键段CS》已经公布,欢迎參阅。

秒杀多线程第六篇 经典线程同步 事件Event》已经公布,欢迎參阅。

秒杀多线程第七篇 经典线程同步 相互排斥量Mutex已经公布,欢迎參阅。

秒杀多线程第八篇 经典线程同步 信号量Semaphore已经公布,欢迎參阅。 

 

 

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/7442333

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118848.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ADRC学习笔记( 一)[通俗易懂]

    ADRC学习笔记( 一)[通俗易懂]近期正在自学自抗扰技术,不得不感叹韩老师乃神人也!话不多说先把这两天的学习成果与大家分享,后续在做详细的介绍。欢迎大家批评指正。(1)过渡过程输入一个阶跃信号,其跟踪效果如图所示,可以看到毫无超调。(2)扩张状态观测器(3)非线性组合(4)整个控制器结构最后附上学习的资料,需要的小伙伴自取,simulink仿真和matalb仿真代码也会陆续分享出来,敬请关注。自抗扰学习资料…

    2022年5月12日
    37
  • excel图片链接显示为图片_怎样将图片拼接成长图

    excel图片链接显示为图片_怎样将图片拼接成长图由于公司需要统计根据门店业绩和装修档次定制扶持政策,所以要到处携带门店门头照片+业绩的报表,而数据库存储的是图片的链接。由于后台统计报表相对应的库暂时没有插入图片的功能。所以通过宏来完成将Excel中url替换为插入图片,又为了避免插入图片太多,导致Excel大小暴增,所以在选择了对应门店门头照片链接时才插入图片。具体步骤如下:1、进入对应sheet页的ViewCode一种…

    2022年9月22日
    2
  • UVA 11490 – Just Another Problem(数论)

    UVA 11490 – Just Another Problem(数论)

    2022年1月19日
    43
  • ORA-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1498], [18713], [18720]

    ORA-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1498], [18713], [18720]

    2021年9月13日
    48
  • Apache tez_apache ii

    Apache tez_apache ii转发自这位大佬博客:https://www.cnblogs.com/rongfengliang/p/6991020.html你可能听说过ApacheTez,它是一个针对Hadoop数据处理应用程序的新分布式执行框架。但是它到底是什么呢?它的工作原理是什么?哪些人应该使用它,为什么?如果你有这些疑问,那么可以看一下BikasSaha和ArunMurthy提供的呈现“ApacheTez:加…

    2025年8月7日
    3
  • 个性化推荐算法总结[通俗易懂]

    个性化推荐算法总结[通俗易懂]读书笔记|《推荐系统实践》-个性化推荐系统总结对于推荐系统,本文总结内容,如下图所示:一、什么是推荐系统1.为什么需要推荐系统为了解决互联网时代下的信息超载问题。2.搜索引擎与推荐系统分类目录,是将著名网站分门别类,从而方便用户根据类别查找公司。 搜索引擎,用户通过输入关键字,查找自己需要的信息。 推荐系统,和搜索引擎一样,是一种帮助用户快速发展有用信…

    2022年5月2日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号