Windows執行緒同步

2021-06-23 05:36:36 字數 3708 閱讀 7587

以下內容摘抄自《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(

_in_opt_  lpsecurity_attributes lpsemaphoreattributes,

_in_      long linitialcount,

_in_      long lmaximumcount,

_in_opt_  lpctstr lpname

);

返回值:成功返回訊號量控制代碼,失敗返回 null;

引數: 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.互鎖函式 臨界區和互鎖函式沒有相應的核心物件因而不能跨程序 只能同步同乙個程序的執行緒之間的同步,因為臨界區不能跨越程序的邊界工作。也是因為...