以下內容摘抄自《visual c++開發技術大全》,為學習筆記。
執行緒同步的方法有很多,最常用的有
互斥(cmutex)
臨界(criticalsection)
訊號量(semaphore)
事件(event)等。
這4種方式分別在 win32 和 mfc 兩種方式下各有一種實現, mfc 方式是對 win32方式的封裝,使用起來更加簡便。
互斥(cmutex)就是乙個執行緒對共享資源進行訪問時排斥其他的執行緒。互斥物件可通過
createmutex
函式建立,在程式執行時只有擁有互斥物件的執行緒有訪問共享資源的權利。如果執行緒對共享資源使用完了,要用
releasemutex
函式交出互斥物件,好讓其他執行緒擁有對共享資源的訪問權利。
#include #include #define threadcount 2
handle ghmutex;
dword winapi writetodatabase( lpvoid );
int main( void )
// create worker threads
for( i=0; i < threadcount; i++ )
}// wait for all threads to terminate
waitformultipleobjects(threadcount, athread, true, infinite);
// close thread and mutex handles
for( i=0; i < threadcount; i++ )
closehandle(athread[i]);
closehandle(ghmutex);
return 0;
}dword winapi writetodatabase( lpvoid lpparam )
__finally
} break;
// the thread got ownership of an abandoned mutex
// the database is in an indeterminate state
case wait_abandoned:
return false; }}
return true;
}
訊號量允許多個執行緒在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大執行緒數目,超出這個最大數的執行緒將不允許訪問此資源。主要通過
createsemaphore
函式來實現。
handle winapi createsemaphore(返回值:成功返回訊號量控制代碼,失敗返回 null;_in_opt_ lpsecurity_attributes lpsemaphoreattributes,
_in_ long linitialcount,
_in_ long lmaximumcount,
_in_opt_ lpctstr lpname
);
引數: lpsemaphoreattributes 安全屬性
linitialcount 正在執行執行緒的數量
lmaximumcount 允許的最大數量
lpname 訊號量名稱
從函式原型可以看出,建立訊號量時需要指出允許的最大資源計數和當前可用資源計數,每增加乙個訪問共享資源的執行緒,當前可以資源計數就減一。
#include #include #define max_sem_count 10
#define threadcount 12
handle ghsemaphore;
dword winapi threadproc( lpvoid );
int main( void )
// create worker threads
for( i=0; i < threadcount; i++ )
}// wait for all threads to terminate
waitformultipleobjects(threadcount, athread, true, infinite);
// close thread and semaphore handles
for( i=0; i < threadcount; i++ )
closehandle(athread[i]);
closehandle(ghsemaphore);
return 0;
}dword winapi threadproc( lpvoid lpparam )
break;
// the semaphore was nonsignaled, so a time-out occurred.
case wait_timeout:
printf("thread %d: wait timed out\n", getcurrentthreadid());
break; }}
return true;
}
用事件 (event)來實現執行緒的同步和互斥很相似。setevent可以看做是對某項特定任務完成的通知,先用createevent 函式建立乙個事件控制代碼,然後啟動使用 waitforsingleobject 函式來等待事件發生。
#include #include #define threadcount 4
handle ghwriteevent;
handle ghthreads[threadcount];
dword winapi threadproc(lpvoid);
void createeventsandthreads(void)
// create multiple threads to read from the buffer.
for(i = 0; i < threadcount; i++)
}}void writetobuffer(void)
}void closeevents()
int main( void )
// close the events to clean up
closeevents();
return 0;
}dword winapi threadproc(lpvoid lpparam)
// now that we are done reading the buffer, we could use another
// event to signal that this thread is no longer reading. this
// example simply uses the thread handle for synchronization (the
// handle is signaled when the thread terminates.)
printf("thread %d exiting\n", getcurrentthreadid());
return 1;
}
Windows執行緒同步
多執行緒程式中,多個執行緒在申請唯一份資源時,存在乙個隱患那就是重複使用。舉乙個例子,火車售票系統,一共100張票,用兩個執行緒來模擬售票。dword winapi fun1proc lpvoid lpparameter dword winapi fun1proc lpvoid lpparamete...
windows核心物件執行緒同步
等待函式可使執行緒自願進入等待狀態,直到乙個特定的核心物件變為已通知狀態為止。waitforsingleobject 函式 dword waitforsingleobject handle hobject,dword dwmilliseconds 第乙個引數hobject標識乙個能夠支援被通知 未通...
Windows中多執行緒的同步
windows程序間同步方式有 1.互斥量 mutex 2.訊號量 semaphore 3.事件 event 4.臨界區 critical section 5.互鎖函式 臨界區和互鎖函式沒有相應的核心物件因而不能跨程序 只能同步同乙個程序的執行緒之間的同步,因為臨界區不能跨越程序的邊界工作。也是因為...