windows下 C++ 多线程+使用互斥资源(购票程序为例)

因为需要些多线程的C++爬虫 之前弄得多线程没有使用互斥,然后出现一些问题就是,重复下载了网页......网上查了下  发现这块代码不多  所以我写个博客 分享给需要的人

编译环境VS2013+WIN8.1 或者codeblocks +win8.1  下面的代码是codeblocks下的,变化一处就可以放vs  见注释

代码参考了这里:http://bbs.csdn.net/topics/370051110

// MulThread.cpp : 定义控制台应用程序的入口点。
//


#include <iostream>
#include <windows.h>
#include <process.h>
#include <fstream>
#include <stdlib.h>
#include <cstdio>
using namespace std;


DWORD WINAPI Fun1Proc(
	LPVOID lpParameter   // thread data
	);

DWORD WINAPI Fun2Proc(
	LPVOID lpParameter   // thread data
	);
int index = 0;
int tickets = 100;
HANDLE hMutex;
int main()
{
	HANDLE hThread1;
	HANDLE hThread2;
	hThread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);
	hThread2 = CreateThread(NULL, 0, Fun2Proc, NULL, 0, NULL);
	CloseHandle(hThread1);
	CloseHandle(hThread2);

	//    hMutex=CreateMutex(NULL,TRUE,NULL);
	hMutex = CreateMutex(NULL, TRUE, "queue");//如果是VS2013 hMutex = CreateMutex(NULL, TRUE, L"queue");
	if (hMutex)
	{
		if (ERROR_ALREADY_EXISTS == GetLastError())
		{
			cout << "only one instance can run!" << endl;
			return 0;
		}
	}
	WaitForSingleObject(hMutex, INFINITE);
	ReleaseMutex(hMutex);
	ReleaseMutex(hMutex);

	//Sleep(4000);
	system("pause");
	return 0;
}

DWORD WINAPI Fun1Proc(
	LPVOID lpParameter   // thread data
	)
{
	   while(TRUE)
	{
        WaitForSingleObject(hMutex,INFINITE);
        if(tickets>0)
        {
        Sleep(1);
        cout<<"thread1 sell ticket : "<<tickets--<<endl;
        }
        else
        break;
        ReleaseMutex(hMutex);
	}
	return 0;
}

DWORD WINAPI Fun2Proc(
	LPVOID lpParameter   // thread data
	)
{
    while(TRUE)
	{
        WaitForSingleObject(hMutex,INFINITE);
        if(tickets>0)
        {
        Sleep(1);
        cout<<"thread2 sell ticket : "<<tickets--<<endl;
        }
        else
        break;
        ReleaseMutex(hMutex);
	}
	return 0;
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。