|
Linux线程 互斥运行
在编译中请加-lpthread参数,例如: g++ -c name.c g++ -o name name.o -lpthread
/*事例代码*/
#include
"
pthread.h
"
#include
"
stdio.h
"
pthread_mutex_t mutex;
void
*
thread_test(
void
*
ptr)
{ pthread_mutex_lock(
&
mutex); printf(
"
test
"
); pthread_mutex_unlock(
&
mutex); }
int
main()
{ pthread_t pid; pthread_mutex_init (
&
mutex,NULL); pthread_create(
&
pid, NULL, test_thread, NULL);
return
0
; }
Win32线程 互斥运行
#include
<
iostream
>
#include
<
windows.h
>
static
HANDLE g_handle;
static
int
g_nThreadID
=
0
;
static
void
*
ThreadProc(
void
*
param)
{
int
*
p
=
(
int
*
)param;
int
currentThread
=
g_nThreadID
++
; WaitForSingleObject(g_handle, INFINITE);
//
开始互斥
for
(
int
i
=
0
; i
<
5
; i
++
)
{ (
*
p)
++
; printf(
"
Thread[%d] %d\n
"
,currentThread,
*
p); Sleep(
500
); }
ReleaseMutex(g_handle);
//
解锁
Sleep(
100
); printf(
"
Thread[%d] return\n
"
,currentThread);
return
0
; }
int
main(
void
)
{
int
n
=
0
; g_handle
=
CreateMutex(NULL,FALSE,NULL);
//
第四个参数为字符串表示进程间互斥
CreateThread(NULL,
0
, (LPTHREAD_START_ROUTINE)ThreadProc,
&
n,
0
, NULL);
CreateThread(NULL,
0
, (LPTHREAD_START_ROUTINE)ThreadProc,
&
n,
0
, NULL);
CreateThread(NULL,
0
, (LPTHREAD_START_ROUTINE)ThreadProc,
&
n,
0
, NULL); getchar();
return
0
; }
Win32线程 利用事件互斥运行
#include
<
iostream
>
#include
<
windows.h
>
static
HANDLE g_handle;
static
int
g_nThreadID
=
0
;
static
void
*
ThreadProc(
void
*
param)
{
int
*
p
=
(
int
*
)param;
int
currentThread
=
g_nThreadID
++
; WaitForSingleObject(g_handle, INFINITE);
//
等待事件(互斥)
for
(
int
i
=
0
; i
<
5
; i
++
)
{ (
*
p)
++
; printf(
"
Thread[%d] %d\n
"
,currentThread,
*
p); Sleep(
500
);
}
SetEvent(g_handle);
//
发送事件(解锁)
Sleep(
100
); printf(
"
Thread[%d] return\n
"
,currentThread);
return
0
; }
int
main(
void
)
{
int
n
=
0
; g_handle
=
CreateEvent(NULL, FALSE, TRUE, NULL);
//
第三个参数表示初始状态,第四个参数为字符串表示进程间互斥
CreateThread(NULL,
0
, (LPTHREAD_START_ROUTINE)ThreadProc,
&
n,
0
, NULL); CreateThread(NULL,
0
, (LPTHREAD_START_ROUTINE)ThreadProc,
&
n,
0
, NULL); CreateThread(NULL,
0
, (LPTHREAD_START_ROUTINE)ThreadProc,
&
n,
0
, NULL); getchar();
return
0
; }
Win32线程 利用MFC的CMutex类互斥运行
#include
<
afxmt.h
>
int
g_nThreadID
=
0
; CMutex g_mutex(FALSE,NULL);
//
第一个参数表示初始状态FALSE=解锁状态,第二个参数为字符串表示进程间互斥NULL=线程间互斥
static
void
*
ThreadProc(
void
*
param)
{
int
*
p
=
(
int
*
)param;
int
currentThread
=
g_nThreadID
++
; g_mutex.Lock();
//
加锁
for
(
int
i
=
0
; i
<
5
; i
++
)
{ (
*
p)
++
; printf(
"
Thread[%d] %d\n
"
,currentThread,
*
p); Sleep(
500
); }
g_mutex.Unlock();
//
解锁
Sleep(
100
); printf(
"
Thread[%d] return\n
"
,currentThread);
return
0
; }
int
Run()
{
int
n
=
0
; CreateThread(NULL,
0
, (LPTHREAD_START_ROUTINE)ThreadProc,
&
n,
0
, NULL); CreateThread(NULL,
0
, (LPTHREAD_START_ROUTINE)ThreadProc,
&
n,
0
, NULL); CreateThread(NULL,
0
, (LPTHREAD_START_ROUTINE)ThreadProc,
&
n,
0
, NULL); getchar();
return
0
; }
CreateMutex()和CMutex一样都是对线程间的临界区加互斥锁,即使在该线程内部加多少次锁,同一线程内部的方法都可以反复进入该临界区。 如果线程不终止,则解锁次数和加锁次数必须一致才能完全解锁。 线程结束后该线程加的所有锁会自动解开,可以不必一一解锁。 例如下面代码,g_mutex.Lock();二次被执行仍然可以继续进入临界区域。
HANDLE g_handle = CreateMutex(NULL,FALSE,NULL); static void* ThreadProc(void* param) { int nThreadID = g_nThreadID++; for (int i=0; i<2; i++) { WaitForSingleObject(g_handle, INFINITE); //即使多次加锁,同一线程仍然可以进入临界区 printf("threadID=%d do=%d\n",nThreadID,i); Sleep(100); } ReleaseMutex(g_handle);//解锁 ReleaseMutex(g_handle);//解锁 getchar(); return 0; }
CreateEvent()方法利用事件互斥运行,一旦加锁,不管是否在同一线程都必须等待一个唤醒事件才能解锁。 线程结束后该线程加的所有等待的事件不能自动解开.
HANDLE g_handle = CreateEvent(NULL, FALSE, TRUE, NULL); static void* ThreadProc(void* param) { int nThreadID = g_nThreadID++; for (int i=0; i<2; i++) { WaitForSingleObject(g_handle, INFINITE); //等待事件 (会死锁) printf("threadID=%d do=%d\n",nThreadID,i); Sleep(100); } SetEvent(g_handle);//发送事件 SetEvent(g_handle);//发送事件 getchar(); return 0; }
|