一个简单的多线程题目
2015-07-24 13:43
781 查看
今天看到一个简单的多线程题目,自己写了一下,功能基本实现,如有问题还望指出交流;
题目:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
运行结果:
题目:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
// TEST-3.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <Windows.h> #include <process.h> CRITICAL_SECTION g_cs; //题目较简单,没有用到临界区 HANDLE g_SemaphoreA,g_SemaphoreB,g_SemaphoreC; int g_nNum = 0; bool g_bFlag = true; unsigned int __stdcall FunA(PVOID pPm) { while(g_bFlag) { WaitForSingleObject(g_SemaphoreA,INFINITE); if (g_nNum ==10) { ReleaseSemaphore(g_SemaphoreA,1,NULL); ReleaseSemaphore(g_SemaphoreB,1,NULL); ReleaseSemaphore(g_SemaphoreC,1,NULL); g_bFlag = false; break; } else ++g_nNum; printf("A:第%d次打印,ID%d\r\n",g_nNum,GetCurrentThreadId()); ReleaseSemaphore(g_SemaphoreB,1,NULL); Sleep(10); } return 0; } unsigned int __stdcall FunB(PVOID pPm) { while(g_bFlag) { WaitForSingleObject(g_SemaphoreB,INFINITE); printf("B:第%d次打印,ID%d\r\n",g_nNum,GetCurrentThreadId()); ReleaseSemaphore(g_SemaphoreC,1,NULL); Sleep(10); } return 0; } unsigned int __stdcall FunC(PVOID pPm) { while(g_bFlag) { WaitForSingleObject(g_SemaphoreC,INFINITE); printf("C:第%d次打印,ID%d\r\n",g_nNum,GetCurrentThreadId()); ReleaseSemaphore(g_SemaphoreA,1,NULL); Sleep(10); } return 0; } int _tmain(int argc, _TCHAR* argv[]) { g_SemaphoreA = CreateSemaphore(NULL,1,3,NULL); g_SemaphoreB = CreateSemaphore(NULL,0,3,NULL); g_SemaphoreC = CreateSemaphore(NULL,0,3,NULL); InitializeCriticalSectionAndSpinCount(&g_cs,4000); HANDLE hThread[3]; hThread[0]=(HANDLE)_beginthreadex(NULL,0,FunA,NULL,0,NULL); hThread[1]=(HANDLE)_beginthreadex(NULL,0,FunB,NULL,0,NULL); hThread[2]=(HANDLE)_beginthreadex(NULL,0,FunC,NULL,0,NULL); WaitForMultipleObjects(3,hThread,TRUE,INFINITE); CloseHandle(g_SemaphoreA); CloseHandle(g_SemaphoreB); CloseHandle(g_SemaphoreC); DeleteCriticalSection(&g_cs); for (int i = 0 ;i<3;++i) { CloseHandle(hThread[i]); } return 0; }
运行结果:
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- C#线程间不能调用剪切板的解决方法
- Lua和C语言的交互详解
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#线程同步的三类情景分析
- C#子线程更新UI控件的方法实例总结
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- C#控制台下测试多线程的方法
- Ruby 多线程的潜力和弱点分析
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解