您的位置:首页 > 其它

win32线程同步5大方案例程--_beginthreadex

2011-06-07 10:18 134 查看
转自:http://download.csdn.net/down/2887013/virgil0236

//线程同步-互斥量
#include <Windows.h>
#include <process.h>
#include <iostream>
using namespace std;

const int G_THREAD_INSTANCE_NUMBER = 3;

unsigned __stdcall ThreadProc(LPVOID pData);

int main()
{
unsigned ID[G_THREAD_INSTANCE_NUMBER];
HANDLE h[G_THREAD_INSTANCE_NUMBER];
HANDLE hMutex;

hMutex = CreateMutex(NULL, FALSE, TEXT("MutexTest"));
if(!hMutex) {
cout << "Create Mutex error!" << endl;
return 0;
}

for(int i = 0; i < G_THREAD_INSTANCE_NUMBER; ++i) {
h[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, (void*)&ID[i], 0, &(ID[i]));
Sleep(1000);
}

WaitForMultipleObjects(G_THREAD_INSTANCE_NUMBER, h, TRUE, INFINITE);
for(int i = 0; i < G_THREAD_INSTANCE_NUMBER; ++i){
CloseHandle(h[i]);
}
cout << "Close the mutex handle!" << endl;
CloseHandle(hMutex);
}

unsigned __stdcall ThreadProc(LPVOID pData)
{
int nThreadNumberTemp = (*(int*)pData);
HANDLE hMutex;

cout << "ThreadProc:" << nThreadNumberTemp << "is running!" << endl;
hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, TEXT("MutexTest"));
if(!hMutex) {
cout << "Open Mutex error!" << endl;
}
else {
cout << "ThreadProc" << nThreadNumberTemp << "gets the mutex/n" << endl;
ReleaseMutex(hMutex);
}

CloseHandle(hMutex);
return 0;
}

//线程同步-临界区
#include <Windows.h>
#include <process.h>
#include <iostream>
using namespace std;

int g_total = 100;
HANDLE g_evFin[2];
CRITICAL_SECTION cs;

unsigned __stdcall WithdrawThread1(LPVOID param);
unsigned __stdcall WithdrawThread2(LPVOID param);

int main()
{
g_evFin[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
g_evFin[1] = CreateEvent(NULL, FALSE, FALSE, NULL);

HANDLE handle1;
HANDLE handle2;

InitializeCriticalSection(&cs);
handle1 = (HANDLE)_beginthreadex(NULL, 0, WithdrawThread1, NULL, 0, NULL);
handle2 = (HANDLE)_beginthreadex(NULL, 0, WithdrawThread2, NULL, 0, NULL);

WaitForMultipleObjects(2, g_evFin, TRUE, INFINITE);
cout << g_total << endl;

DeleteCriticalSection(&cs);
CloseHandle(g_evFin[0]);
CloseHandle(g_evFin[1]);
CloseHandle(handle1);
CloseHandle(handle2);
}

unsigned __stdcall WithdrawThread1(LPVOID param)
{
EnterCriticalSection(&cs);

if(g_total-90 >= 0) {
g_total -= 90;
cout << "You withdraw 90" << endl;
}
else
cout << "You do not have that much money" << endl;

LeaveCriticalSection(&cs);
SetEvent(g_evFin[0]);
return 0;
}

unsigned __stdcall WithdrawThread2(LPVOID param)
{
EnterCriticalSection(&cs);

if(g_total-20 >= 0) {
g_total -= 20;
cout << "You withdraw 20" << endl;
}
else
cout << "You do not have that much money" << endl;

LeaveCriticalSection(&cs);

SetEvent(g_evFin[1]);
return 0;
}

//线程同步-全局变量
//该方法不安全!只为演示用
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;

bool g_bVal = false;

unsigned __stdcall ThreadFunc(LPVOID pParam);

int main()
{
HANDLE handle = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, NULL);
if(!handle) {
cout << "Thread create error!" << endl;
CloseHandle(handle);
}

while(!g_bVal)
cout << "Thread while" << endl;
cout << "thread exit" << endl;

CloseHandle(handle);
}

unsigned __stdcall ThreadFunc(LPVOID pParam)
{
cout << "ThreadFunc" << endl;
Sleep(200);
g_bVal = true;
return 0;
}

//线程同步-事件
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;

HANDLE evRead;
HANDLE evFinish;

unsigned __stdcall ReadThread(LPVOID param);
unsigned __stdcall WINAPI WriteThread(LPVOID param);

int main()
{
evRead = CreateEvent(NULL, FALSE, FALSE, NULL);
evFinish = CreateEvent(NULL, FALSE, FALSE, NULL);

HANDLE handle1;
HANDLE handle2;
handle1 = (HANDLE)_beginthreadex(NULL, 0, ReadThread, NULL, 0, NULL);
handle2 = (HANDLE)_beginthreadex(NULL, 0, WriteThread, NULL, 0, NULL);

WaitForSingleObject(evFinish, INFINITE);
cout << "The program is end" << endl;

CloseHandle(handle1);
CloseHandle(handle2);
CloseHandle(evRead);
CloseHandle(evFinish);
}

unsigned __stdcall ReadThread(LPVOID param)
{
WaitForSingleObject(evRead, INFINITE);
cout << "Reading" << endl;
SetEvent(evFinish);

return 0;
}

unsigned __stdcall WriteThread(LPVOID param)
{
cout << "Writing" << endl;
SetEvent(evRead);

return 0;
}

//线程同步-信号量
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;

#define THREAD_INSTANCE_NUMBER 3
unsigned __stdcall foo(void* pData);

int main()
{
unsigned nThreadID[THREAD_INSTANCE_NUMBER];
HANDLE threads[THREAD_INSTANCE_NUMBER];
HANDLE hSemaphore;

hSemaphore = CreateSemaphore(NULL, 0, 1, TEXT("Semaphore.Test"));
if(!hSemaphore) {
cout << "Create semaphore error!" << endl;
return 0;
}

for(int i = 0; i < THREAD_INSTANCE_NUMBER; ++i) {
threads[i] = (HANDLE)_beginthreadex(NULL, 0, foo, (void*)&nThreadID[i], 0, &(nThreadID[i]));
Sleep(1000);
}

WaitForMultipleObjects(THREAD_INSTANCE_NUMBER, (HANDLE*)threads, TRUE, INFINITE);
cout << "Close the semaphore handle!" << endl;

for(int i = 0; i < THREAD_INSTANCE_NUMBER; ++i)
CloseHandle(threads[i]);
CloseHandle(hSemaphore);
}

unsigned __stdcall foo(void* pData)
{
int nThreadNumberTemp = (*(int*)pData);
HANDLE hSemaphore;

cout << "foo:" << nThreadNumberTemp << "is running!" << endl;
hSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, TEXT("Semaphore.Test"));
if(!hSemaphore)
cout << "Open semaphore error!" << endl;
cout << "foo" << nThreadNumberTemp << "gets the semaphore/n" << endl;
ReleaseSemaphore(hSemaphore, 1, NULL);
CloseHandle(hSemaphore);

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