上一篇《秒杀多线程第三篇原子操作Interlocked系列函数》中介绍了原子操作在多进程中的作用,现在来个复杂点的。这个问题涉及到线程的同步和互斥,是一道非常有代表性的多线程同步问题,如果能将这个问题搞清楚,那么对多线程同步也就打下了良好的基础。
程序描述:
主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数-> sleep(50) ->全局变量++ -> sleep(0) ->输出参数和全局变量。
要求:
1.子线程输出的线程序号不能重复。
2.全局变量的输出必须递增。
下面画了个简单的示意图:
分析下这个问题的考察点,主要考察点有二个:
1.主线程创建子线程并传入一个指向变量地址的指针作参数,由于线程启动须要花费一定的时间,所以在子线程根据这个指针访问并保存数据前,主线程应等待子线程保存完毕后才能改动该参数并启动下一个线程。这涉及到主线程与子线程之间的同步。
2.子线程之间会互斥的改动和输出全局变量。要求全局变量的输出必须递增。这涉及到各子线程间的互斥。
下面列出这个程序的基本框架,可以在此代码基础上进行修改和验证。
-
-
#include<stdio.h>
-
#include<process.h>
-
#include<windows.h>
-
-
longg_nNum;
-
unsignedint__stdcallFun(void*pPM);
-
constintTHREAD_NUM=10;
-
-
intmain()
-
{
-
g_nNum=0;
-
HANDLEhandle[THREAD_NUM];
-
-
inti=0;
-
while(i<THREAD_NUM)
-
{
-
handle[i]=(HANDLE)_beginthreadex(NULL,0,Fun,&i,0,NULL);
-
i++;
-
}
-
-
WaitForMultipleObjects(THREAD_NUM,handle,TRUE,INFINITE);
-
return0;
-
}
-
-
unsignedint__stdcallFun(void*pPM)
-
{
-
-
intnThreadNum=*(int*)pPM;
-
Sleep(50);
-
g_nNum++;
-
Sleep(0);
-
printf("线程编号为%d全局资源值为%d\n",nThreadNum,g_nNum);
-
return0;
-
}
运行结果可以参考下列图示,强烈建议读者亲自试一试。
图1
图2
图3
可以看出,运行结果完全是混乱和不可预知的。本系列将会运用Windows平台下各种手段包括关键段,事件,互斥量,信号量等等来解决这个问题并作一份全面的总结,敬请关注。
《秒杀多线程第五篇 经典线程同步 关键段CS》已经发布,欢迎参阅。
《秒杀多线程第六篇 经典线程同步 事件Event》已经发布,欢迎参阅。
《秒杀多线程第七篇 经典线程同步 互斥量Mutex》已经发布,欢迎参阅。
《秒杀多线程第八篇 经典线程同步 信号量Semaphore》已经发布,欢迎参阅。
分享到:
相关推荐
在《秒杀多线程系列》的前十五篇中介绍多线程的相关概念,多线程同步互斥问题《秒杀多线程第四篇一个经典的多线程同步问题》及解决多线程同步互斥的常用方法——关键段、事件、互斥量、信号量、读写锁。为了让大家...
这些问题的解决需要综合使用各种同步机制,同时还要掌握相应的“内功心法”,即深入理解多线程同步互斥的原理和应用。 四、多线程面试题目解析 多线程相关的面试题目一般分为概念性问答题、选择题和综合题。概念性...
摘要:VC/C++源码,系统相关,多线程同步 多线程十大经典案例之一秒杀多线程,多线程同步互斥问题《秒杀多线程第四篇一个经典的多线程同步问题》及解决多线程同步互斥的常用方法——关键段、事件、互斥量、信号量、...
4. **处理队列中的任务**:`ScanQueue`方法同样在一个循环中工作,当队列不为空时,它会取出并处理队列的第一个元素(即`ListQueue.Dequeue()`)。这里,`ScanQueue`方法代表实际执行文章发布的逻辑。处理完一个任务...
标题中的“淘宝茅台抢购最新优化版本,淘宝茅台秒杀,优化了茅台抢购线程队列”揭示了这是一个针对淘宝平台茅台商品抢购的软件或脚本的更新版本,重点在于对线程队列进行了优化,以提高抢购成功率。在IT行业中,这种...
1. **并发控制**:Java中的synchronized关键字和ReentrantLock可以用于线程同步,防止多个线程同时操作同一资源。在秒杀场景下,我们可以考虑使用乐观锁(如版本号机制)或者分布式锁(如Redis)来避免并发带来的...
秒杀系统是电商、互联网行业中常见的一种促销策略,它能够在短时间内吸引大量用户参与,对系统的稳定性和性能提出了极高的要求。本章视频课程主要聚焦在...结合Java技术栈,你将有能力构建一个稳定、高效的秒杀系统。
1. **锁**:主要用于解决单进程内的多线程并发问题,确保对公共变量的同步操作。 2. **分布式锁**:适用于分布式系统,防止多进程同时操作同一资源,解决进程间的并发问题。 3. **事务**:确保在一个会话内,所有对...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...