MFC多執行緒與多執行緒的同步

2021-06-15 04:38:37 字數 3120 閱讀 4744

dword winapi threadproc(

lpvoid lpparameter

); //注意這裡threadproc這個名字是可以按自己的要求修改的;

handle winapi createthread(

lpsecurity_attributes lpthreadattributes, //安全性

size_t dwstacksize, // 初始棧的大小

lpthread_start_routine lpstartaddress, // 執行緒入口函式的位址

lpvoid lpparameter, //執行緒入口函式的形參

dword dwcreationflags, //執行緒建立後是否立即執行

lpdword lpthreadid

);

以下就是用多執行緒實現的乙個賣票程式

//用到了建立執行緒等windows的函式一次要包含相應標頭檔案

#include#include//這裡需要注意若不加使用標準命名空間的話會使得i/o函式無法識別

using namespace std;

//建立乙個不含執行緒同步的基礎多執行緒買票程式

//共有100z張可供銷售的車票

int tickets=100;

int index=0;

//宣告執行緒入口函式

dword winapi fun1proc(lpvoid);

dword winapi fun2proc(lpvoid);

void main()

//執行緒1的入口函式

dword winapi fun1proc(lpvoid lpparameter)

{ while(true)

{ if(tickets>0)

{ //sleep(1);

cout<<"thread1 sells "<0)

{ //sleep(1);

cout<<"thread2 sells "<

上面的程式雖然可以使用多執行緒的執行,但這裡面存在著乙個潛在的隱患,就是當票數還剩一張時,由於tickets>1是由於大於0因此進入if條件語句,而若執行緒1執行到sleep(1)初時他的時間片到點了,換成執行緒2執行。此時由於沒有執行cout語句因此tickets仍然為1,而執行緒2執行後ticket是變為0。此時執行緒1開始從掛起處開始執行,雖然對此事沒有票了,但由於是在掛起處執行的因此會繼續執行後面的語句造成出現存票為0但仍然可以買票的bug。

為了解決上述的問題,需要對執行緒進行同步,執行緒同步有四種方式:事件物件(event)、互斥物件(mutex)、關鍵**段(criticalsection)

建立互斥物件控制代碼

//宣告執行緒入口函式

dword winapi fun1proc(lpvoid);

dword winapi fun2proc(lpvoid);

//建立互斥物件控制代碼

handle hmutex;

在主線程中建立互斥物件

hmutex=createmutex(null,false,null); //建立互斥物件

//建立執行緒

hthread1=createthread(null,0,fun1proc,null,0,null);

hthread2=createthread(null,0,fun2proc,null,0,null);

while(true)

{ //等待互斥物件變為有訊號;

waitforsingleobject(hmutex,infinite);

if(tickets>0)

{ sleep(1);

cout<<"thread1 sells "<

建立事件物件控制代碼

//建立事件物件控制代碼

handle hevent;

在主線程中建立事件物件,初始為自動重置和有訊號狀態,並在最後關閉控制代碼

hevent=createevent(null,false,true,null);//建立互斥物件

//建立執行緒

hthread1=createthread(null,0,fun1proc,null,0,null);

hthread2=createthread(null,0,fun2proc,null,0,null);

//關閉控制代碼

closehandle(hthread1);

closehandle(hthread2);

//使主線程掛起4秒,以便其他執行緒獲取執行許可權

sleep(4000);

closehandle(hevent);

while(true)

{ //等待事件物件所有權;

waitforsingleobject(hevent,infinite);

//將事件設定為有訊號狀態

resetevent(hevent);

if(tickets>0)

{ sleep(1);

cout<<"thread1 sells "<

建立關鍵**段控制代碼

critical_section g_cs;

在主線程中初始化關鍵**段

//初始化關鍵**段

initializecriticalsection(&g_cs);

while(true)

{ //進入關鍵**段

entercriticalsection(&g_cs);

if(tickets>0)

{ sleep(1);

cout<<"thread1 sells "<

MFC多執行緒 執行緒同步

執行緒間的同步 常用的同步物件 1 臨界區 critical section 2 互斥 mutex 3 訊號量 semaphore 4 事件 event mfc提供了幾種同步類和同步輔助類,包含在afxmt.h中 1 同步物件基類 csyncobject 抽象類,為win32中的同步物件提供通用效能...

MFC多執行緒同步方法

mfc提供了多種同步物件,下面我們只介紹最常用的四種 a 使用 ccriticalsection 類 當多個執行緒訪問乙個獨占性共享資源時,可以使用 臨界區 物件。任一時刻只有乙個執行緒可以擁有臨界區物件,擁有臨界區的執行緒可以訪問被保護起來的資源或 段,其他希望進入臨界區的執行緒將被掛起等待,直到...

MFC多執行緒同步方法

mfc提供了多種同步物件,下面我們只介紹最常用的四種 a 使用 ccriticalsection 類 當多個執行緒訪問乙個獨占性共享資源時,可以使用 臨界區 物件。任一時刻只有乙個執行緒可以擁有臨界區物件,擁有臨界區的執行緒可以訪問被保護起來的資源或 段,其他希望進入臨界區的執行緒將被掛起等待,直到...