开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

来源:互联网 发布:c语言 sleep 头文件 编辑:程序博客网 时间:2024/04/16 20:19
// Mut.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <Windows.h>#include <stdio.h>CRITICAL_SECTION g_cs;DWORD WINAPI WriteA(){//DWORD i=GetCurrentThreadId();for (int i=0;i<10;i++){EnterCriticalSection(&g_cs);printf("%d ",GetCurrentThreadId());Sleep(10);LeaveCriticalSection(&g_cs);}//Sleep(100);return 0;}DWORD WINAPI WriteB(){for (int i=0;i<10;i++){EnterCriticalSection(&g_cs);printf("%d ",GetCurrentThreadId());Sleep(10);LeaveCriticalSection(&g_cs);}//Sleep(100);return 0;}DWORD WINAPI WriteC(){for (int i=0;i<10;i++){EnterCriticalSection(&g_cs);printf("%d \n",GetCurrentThreadId());Sleep(10);LeaveCriticalSection(&g_cs);}//Sleep(100);return 0;}int _tmain(int argc, _TCHAR* argv[]){HANDLE hThread[3];DWORD pThreadID[3];InitializeCriticalSection(&g_cs);hThread[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WriteA,NULL,0,&pThreadID[0]);hThread[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WriteB,NULL,0,&pThreadID[1]);hThread[2]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WriteC,NULL,0,&pThreadID[2]);WaitForMultipleObjects(3,hThread, TRUE, INFINITE); DeleteCriticalSection(&g_cs);for (int i=0;i<3;i++){CloseHandle(hThread[i]);}getchar();return 0;}

网上的另一种方法

http://blog.csdn.net/dazhong159/article/details/7948327

#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#include <iostream>#include <string>#include <stack>#include <windows.h>#include <process.h>using namespace std;const int THREAD_NUM = 10;HANDLE            ga,gb,gc;unsigned int __stdcall FunA(void *pPM){Sleep(50);//some work should to doprintf("A\n");ReleaseSemaphore(gb, 1, NULL);//递增信号量B的资源数return 0;}unsigned int __stdcall FunB(void *pPM){Sleep(50);//some work should to doprintf("B\n");ReleaseSemaphore(gc, 1, NULL);//递增信号量C的资源数return 0;}unsigned int __stdcall FunC(void *pPM){Sleep(50);//some work should to doprintf("C\n");ReleaseSemaphore(ga, 1, NULL);//递增信号量A的资源数return 0;}int main(){//初始化信号量ga = CreateSemaphore(NULL, 1, 1, NULL);//当前1个资源,最大允许1个同时访问gb = CreateSemaphore(NULL, 0, 1, NULL);//当前0个资源,最大允许1个同时访问gc = CreateSemaphore(NULL, 0, 1, NULL);//当前0个资源,最大允许1个同时访问HANDLE  handle[THREAD_NUM];int i = 0;while (i < THREAD_NUM) {WaitForSingleObject(ga, INFINITE);  //等待信号量A>0handle[i] = (HANDLE)_beginthreadex(NULL, 0, FunA, &i, 0, NULL);WaitForSingleObject(gb, INFINITE);  //等待信号量B>0handle[i] = (HANDLE)_beginthreadex(NULL, 0, FunB, &i, 0, NULL);WaitForSingleObject(gc, INFINITE);  //等待信号量C>0handle[i] = (HANDLE)_beginthreadex(NULL, 0, FunC, &i, 0, NULL);++i;}WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);//销毁信号量CloseHandle(ga);CloseHandle(gb);CloseHandle(gc);for (i = 0; i < THREAD_NUM; i++)CloseHandle(handle[i]);return 0;http://blog.csdn.net/scu_bao/article/details/8624193}

http://blog.csdn.net/scu_bao/article/details/8624193

        static ManualResetEvent manA;        static ManualResetEvent manB;        static ManualResetEvent manC;        static void Main(string[] args)        {            manA = new ManualResetEvent(false);            manB = new ManualResetEvent(false);            manC = new ManualResetEvent(false);            Thread threadA = new Thread(MethodA);            threadA.Start();            Thread threadB = new Thread(MethodB);            threadB.Start();            Thread threadC = new Thread(MethodC);            threadC.Start();            Console.ReadLine();        }        private static void MethodA()        {            for (int i = 0; i < 10; i++)            {                Console.Write("A");                manB.Set();   //终止manB事件,启动一个或多个线程                manA.Reset(); //更改manA事件状态为非终止状态,并阻止                manA.WaitOne();  //阻止线程,等待WaitHandle的信号                }        }        private static void MethodB()        {            manB.WaitOne();            for (int i = 0; i < 10; i++)            {                Console.Write("B");                manC.Set();                manB.Reset();                manB.WaitOne();            }        }        private static void MethodC()        {            manC.WaitOne();            for (int i = 0; i < 10; i++)            {                Console.Write("C");                manA.Set();                manC.Reset();                manC.WaitOne();            }        }