最简单的多线程同步实例


最简单的多线程同步实例

1。
//在同一个线程中顺序调用两个函数
#include
#include
using namespace std;
DWORD WINAPI f1(LPVOID p)
{
for(int i=0;i<10;i++)
{
cout<<"f1"<::Sleep(123);
}
return 0;
}
DWORD WINAPI f2(LPVOID p)
{
for(int i=0;i<10;i++)
{
cout<<"f2"<::Sleep(123);
}
return 0;
}
void main()
{
f1(NULL);
f2(NULL);
}

2。
//在不同线程中顺序调用两个函数
#include
#include
using namespace std;
DWORD WINAPI f1(LPVOID p)
{
for(int i=0;i<10;i++)
{
cout<<"f1"<::Sleep(123);
}
return 0;
}
DWORD WINAPI f2(LPVOID p)
{
for(int i=0;i<10;i++)
{
cout<<"f2"<::Sleep(123);
}
return 0;
}
void main()
{
HANDLE h1=CreateThread(NULL,0,f1,NULL,0,NULL);
HANDLE h2=CreateThread(NULL,0,f2,NULL,0,NULL);
WaitForSingleObject(h1,INFINITE);
WaitForSingleObject(h2,INFINITE);
CloseHandle(h1);
CloseHandle(h2);
}

3。
//在不同线程中顺序调用两个函数
#include
#include
using namespace std;
DWORD WINAPI f1(LPVOID p)
{
for(int i=0;i<10;i++)
{
cout<<"f1="<::Sleep(123);
}
return 0;
}
DWORD WINAPI f2(LPVOID p)
{
for(int i=0;i<10;i++)
{
cout<<"f2="<::Sleep(123);
}
return 0;
}
void main()
{
HANDLE h[2];
h[0]=CreateThread(NULL,0,f1,NULL,0,NULL);
h[1]=CreateThread(NULL,0,f2,NULL,0,NULL);
WaitForMultipleObjects(2,h,TRUE,INFINITE);
CloseHandle(h[0]);
CloseHandle(h[1]);
}

4。
//在不同线程中顺序调用两个函数,使用临界区
#include
#include
using namespace std;
CRITICAL_SECTION cs;//////
DWORD WINAPI f1(LPVOID p)
{
EnterCriticalSection(&cs);//////
for(int i=0;i<10;i++)
{
cout<<"f1="<::Sleep(123);
}
LeaveCriticalSection(&cs);//////
return 0;
}
DWORD WINAPI f2(LPVOID p)
{
EnterCriticalSection(&cs);//////
for(int i=0;i<10;i++)
{
cout<<"f2="<::Sleep(123);
}
LeaveCriticalSection(&cs);//////
return 0;
}
void main()
{
HANDLE h[2];
InitializeCriticalSection(&cs);//////
h[0]=CreateThread(NULL,0,f1,NULL,0,NULL);
h[1]=CreateThread(NULL,0,f2,NULL,0,NULL);
WaitForMultipleObjects(2,h,TRUE,INFINITE);
CloseHandle(h[0]);
CloseHandle(h[1]);
DeleteCriticalSection(&cs);//////
}

5。
//在不同线程中顺序调用两个函数,使用互斥量
#include
#include
using namespace std;
HANDLE m;//////
DWORD WINAPI f1(LPVOID p)
{
WaitForSingleObject(m,INFINITE);//////
for(int i=0;i<10;i++)
{
cout<<"f1="<::Sleep(123);
}
ReleaseMutex(m);//////
return 0;
}
DWORD WINAPI f2(LPVOID p)
{
WaitForSingleObject(m,INFINITE);//////
for(int i=0;i<10;i++)
{
cout<<"f2="<::Sleep

(123);
}
ReleaseMutex(m);//////
return 0;
}
void main()
{
HANDLE h[2];
m=CreateMutex(NULL,FALSE,"互斥量");//////
h[0]=CreateThread(NULL,0,f1,NULL,0,NULL);
h[1]=CreateThread(NULL,0,f2,NULL,0,NULL);
WaitForMultipleObjects(2,h,TRUE,INFINITE);
CloseHandle(h[0]);
CloseHandle(h[1]);
CloseHandle(m);//////
}

6。
//在不同线程中顺序调用两个函数,使用事件
#include
#include
using namespace std;
HANDLE e;//////(安全,人工,有信号,名字)
DWORD WINAPI f1(LPVOID p)
{
for(int i=0;i<10;i++)
{
cout<<"f1="<::Sleep(13);
}
SetEvent(e);
return 0;
}
DWORD WINAPI f2(LPVOID p)
{
WaitForSingleObject(e,INFINITE);
for(int i=0;i<10;i++)
{
cout<<"f2="<::Sleep(13);
}
return 0;
}
void main()
{
HANDLE h[2];
e=CreateEvent(NULL,FALSE,FALSE,NULL);//////自动,无信号
h[0]=CreateThread(NULL,0,f1,NULL,0,NULL);
h[1]=CreateThread(NULL,0,f2,NULL,0,NULL);
WaitForMultipleObjects(2,h,TRUE,INFINITE);
CloseHandle(h[0]);
CloseHandle(h[1]);
}

7。
//在不同线程中顺序调用两个函数,使用信号量
#include
#include
using namespace std;
HANDLE s;//////
DWORD WINAPI f1(LPVOID p)
{
WaitForSingleObject(s,INFINITE);
for(int i=0;i<10;i++)
{
cout<<"f1="<::Sleep(13);
}
ReleaseSemaphore(s,1,NULL);
return 0;
}
DWORD WINAPI f2(LPVOID p)
{
WaitForSingleObject(s,INFINITE);
for(int i=0;i<10;i++)
{
cout<<"f2="<::Sleep(13);
}
ReleaseSemaphore(s,1,NULL);
return 0;
}
void main()
{
HANDLE h[2];
s=CreateSemaphore(NULL,1,1,"信号量");//////initial count,maximum count
h[0]=CreateThread(NULL,0,f1,NULL,0,NULL);
h[1]=CreateThread(NULL,0,f2,NULL,0,NULL);
WaitForMultipleObjects(2,h,TRUE,INFINITE);
CloseHandle(h[0]);
CloseHandle(h[1]);
}

相关文档
最新文档