#include <iostream>
#include <windows.h>
#include <vector>

using namespace std;

int finished=0;
const int ThreadNumber=10;
const int MaxNumber=100;
HANDLE myMutex;
vector<int> myVector;

DWORD WINAPI ThreadProc(void* lpParameter)
{
	int id=*(int*)(lpParameter);
	int counter=0;
	while (counter<MaxNumber)
	{
		//////////////////////////////////////////////////////////////////////
		//if we comment out the mutex statement, we will get error in run time
		WaitForSingleObject(myMutex, INFINITE);
		myVector.push_back(id);
		//if we comment out the mutex statement, we will get error in run time
		ReleaseMutex(myMutex);
		//////////////////////////////////////////////////////////////////////
		counter++;
	}
	cout<<"thread "<<id<<" finished "<<counter<<"\n";
	finished++;
	return 0;
}

int main()
{
	HANDLE threads[ThreadNumber];
	myMutex=CreateMutex(NULL, false, NULL);
	if (myMutex==NULL)
	{
		cout<<"failed to create\n";
		exit(1);
	}
	int idArray[ThreadNumber];
	int idCounter[ThreadNumber];
	int i;
	for (i=0; i<ThreadNumber; i++)
	{
		idArray[i]=i;
		idCounter[i]=0;
		threads[i]=CreateThread(NULL, 0, ThreadProc, idArray+i, 0, NULL);
	}

	while (finished<ThreadNumber)
	{
		Sleep(1000);
	}
	for (i=0; i<myVector.size(); i++)
	{
		int temp=myVector.at(i);
		idCounter[temp]++;
	}
	for (i=0; i<ThreadNumber; i++)
	{
		cout<<"thread "<<i<<" has written "<<idCounter[i]<<"\n";
	}

	return 0;
}







