1.原子訪問:同一時刻只允許同一執行緒訪問資源(變數) 關鍵字:
volatile(防止編譯優化,對特殊位址進行穩定訪問)
可直接操作記憶體
2.關鍵段:同一時刻只允許乙個執行緒訪問乙個**段
initializecriticalsectionandspincount(變數名,0)
例:
// global variable
critical_section criticalsection;
int main( void )
dword winapi threadproc( lpvoid lpparameter )
3.互斥量:mutex本質上說就是一把鎖,提供對資源的獨佔訪問,所以mutex主要的作用是用於
互斥createmutex(安全屬性,null,null(互斥量名字))
例:
#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;
}
4.事件:事件是核心物件,事件分為
手動置位事件
和自動置位事件
。事件可以由
setevent()設定為有訊號
,由resetevent()
來設值為無訊號。
createevent(安全屬性(null),true,false,null(事件名稱))
例
#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;
}
5.訊號量:訊號量(semaphore),有時被稱為
訊號燈,是在多執行緒環境下使用的一種設施, 它負責協調各個執行緒, 以保證它們能夠正確、合理的使用公共資源。
例
#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;
}
注:互斥量,事件,訊號量 都可以跨程序通訊
事件和訊號量可以一起做任務
這些例子都是在vs的幫助裡找到的~~~~
執行緒同步的方式
一 什麼是執行緒的同步 當多個執行緒同時訪問其共享的資源時,需要相互協調,以防止出現資料不一致 不完整的問題,能達到這種狀態執行緒同步 二 執行緒同步的方式 1 互斥量 互斥鎖 如果乙個執行緒要訪問一塊資料時,它就呼叫mutex lock,如果互斥量是處於解鎖狀態,也就是說這塊資料可用,那麼就呼叫成...
執行緒的同步方式
併發 同乙個時間段有多個程式在同乙個cpu上輪流執行 並行 同一時間多個程式在不同cpu上同時執行。併發是在時間段的表象,並行是在時刻的表象。同步 執行緒之間具有依賴關係,乙個執行緒的執行依賴於另乙個執行緒的訊息。互斥 對於程序的某一共享資源,同一時刻只允許乙個執行緒訪問。互斥是一種特殊的同步。實現...
執行緒同步的方式
同步 同步就是協同步調,按預定的先後次序進行執行。如 你說完,我再說。這裡的同步千萬不要理解成那個同時進行,應是指協同 協助 互相配合。執行緒互斥 指對於共享的程序系統資源,在各單個執行緒訪問時的排它性。當有若干個執行緒都要使用某一共享資源時,任何時刻最多隻允許乙個執行緒去使用,其它要使用該資源的執...