VS2010 多線程編程


1、多線程測試實例:

  此時在多核CPU下,主線程和子線程可同時運行;時間片是怎么分配的呢?感覺好亂呢?

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

DWORD WINAPI MyThreadProc1(LPVOID lpParameter);
DWORD WINAPI MyThreadProc2(LPVOID lpParameter);
int index = 0;
int i = 0 , y = 0;
int main()
{
    HANDLE handle1,handle2;
    handle1 = CreateThread(NULL,0,MyThreadProc1,NULL,0,NULL);
    handle2 = CreateThread(NULL,0,MyThreadProc2,NULL,0,NULL);

    if(NULL == handle1)
    {
        cout<<"Create Thread failed !"<<endl;
        return -1;
    }
    if(NULL == handle2)
    {
        cout<<"Create Thread failed !"<<endl;
        return -1;
    }

    CloseHandle(handle1);
    CloseHandle(handle2);

    cout<<"The Main Thread is Running !"<<endl;

    system("PAUSE");
    return 0;
}
DWORD WINAPI MyThreadProc1(LPVOID lpParameter)
{

    cout<<"The MyThreadProc1 is Running !"<<endl;

    return 0;
}
DWORD WINAPI MyThreadProc2(LPVOID lpParameter)
{
    
    cout<<"The MyThreadProc2 is Running ! "<<endl;
    return 0;
}

 

2、線程同步:

 使用互斥對象實現線程同步,主要用到的函數:

  CreateMutex();  其第二個參數若設為TRUE,則主線程擁有一個CPU內核;創建帶名字的互斥對象,根據第三個參數可判斷互斥對象已存在;

  ReleaseMutex();  若線程運行完成后,會自動釋放互斥對象;

  WaitForSingleObject();

(1)沒有同步的實例:

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


DWORD WINAPI MyThreadProc1(LPVOID lpParameter);
DWORD WINAPI MyThreadProc2(LPVOID lpParameter);
int index = 100;

int main()
{
	HANDLE handle1,handle2;
	handle1 = CreateThread(NULL,0,MyThreadProc1,NULL,0,NULL);
	handle2 = CreateThread(NULL,0,MyThreadProc2,NULL,0,NULL);

	if(NULL == handle1)
	{
		cout<<"Create Thread failed !"<<endl;
		return -1;
	}
	if(NULL == handle2)
	{
		cout<<"Create Thread failed !"<<endl;
		return -1;
	}

	CloseHandle(handle1);
	CloseHandle(handle2);

	Sleep(2000);
	system("PAUSE");
	return 0;
}
DWORD WINAPI MyThreadProc1(LPVOID lpParameter)
{
	while(true)
	{
		if(index > 0)
		{
			Sleep(1);
			cout<<"The Index1 Number is : "<<index--<<endl;
		}
		else 
			break;
	}
	return 0;
}
DWORD WINAPI MyThreadProc2(LPVOID lpParameter)
{
	while(true)
	{
		if(index > 0)
		{
			Sleep(1);
			cout<<"The Index2 Number is : "<<index--<<endl;
		}
		else 
			break;
	}
	return 0;
}

 (2)互斥對象實現多線程同步:根據個人電腦CPU而異,此代碼中main()占有一個CPU內核;且沒有使用ReleaseMutex()釋放所占CPU;

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


DWORD WINAPI MyThreadProc1(LPVOID lpParameter);
DWORD WINAPI MyThreadProc2(LPVOID lpParameter);
DWORD WINAPI MyThreadProc3(LPVOID lpParameter);

int index = 100;
HANDLE hMutex;

int main()
{
	HANDLE handle1,handle2,handle3;
	handle1 = CreateThread(NULL,0,MyThreadProc1,NULL,0,NULL);
	handle2 = CreateThread(NULL,0,MyThreadProc2,NULL,0,NULL);
	handle3 = CreateThread(NULL,0,MyThreadProc3,NULL,0,NULL);

	if(NULL == handle1)
	{
		cout<<"Create Thread failed !"<<endl;
		return -1;
	}
	if(NULL == handle2)
	{
		cout<<"Create Thread failed !"<<endl;
		return -1;
	}
	if(NULL == handle3)
	{
		cout<<"Create Thread failed !"<<endl;
		return -1;
	}

	CloseHandle(handle1);
	CloseHandle(handle2);
	CloseHandle(handle3);

	hMutex = CreateMutex(NULL,TRUE,NULL);

	Sleep(2000);
	system("PAUSE");
	return 0;
}
DWORD WINAPI MyThreadProc1(LPVOID lpParameter)
{
	while(true)
	{
		WaitForSingleObject(hMutex,INFINITE);
		if(index > 0)
		{
			Sleep(1);
			cout<<"The Index1 Number is : "<<index--<<endl;
		}
		else 
			break;
	}
	return 0;
}
DWORD WINAPI MyThreadProc2(LPVOID lpParameter)
{
	while(true)
	{
		WaitForSingleObject(hMutex,INFINITE);
		if(index > 0)
		{
			Sleep(1);
			cout<<"The Index2 Number is : "<<index--<<endl;
		}
		else 
			break;
	}
	return 0;
}

DWORD WINAPI MyThreadProc3(LPVOID lpParameter)
{
	while(true)
	{
		WaitForSingleObject(hMutex,INFINITE);
		if(index > 0)
		{
			Sleep(1);
			cout<<"The Index3 Number is : "<<index--<<endl;
		}
		else 
			break;
	}
	return 0;
}

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM