您的位置:首页 > 编程语言 > C语言/C++

一个简单的多线程题目

2015-07-24 13:43 781 查看
今天看到一个简单的多线程题目,自己写了一下,功能基本实现,如有问题还望指出交流;

题目:编写一个程序,开启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;
}

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 c语言 线程