国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
VC下線程同步的三種方法

首選使用臨界區(qū)對(duì)象,主要原因是使用簡(jiǎn)單。
EnterCriticalSection()函數(shù)等候指定的危險(xiǎn)區(qū)段對(duì)象的所有權(quán)。當(dāng)調(diào)用的線程被允許所有權(quán)時(shí),函數(shù)返回。
EnterCriticalSection (),一個(gè)單獨(dú)進(jìn)程的線程可以使用一個(gè)危險(xiǎn)區(qū)段對(duì)象作為相互-排除同步。 進(jìn)程負(fù)責(zé)分配被一個(gè)危險(xiǎn)區(qū)段對(duì)象使用的內(nèi)存, 它藉由聲明一個(gè)CRITICAL_SECTION類(lèi)型 的變量實(shí)現(xiàn)。在使用一個(gè)危險(xiǎn)區(qū)段之前,進(jìn)程的一些線程必須調(diào)用 InitializeCriticalSection 函數(shù)設(shè)定對(duì)象的初值.
為了要使互斥的訪問(wèn)被共享的資源,每個(gè)線程調(diào)用EnterCriticalSection 或者 TryEnterCriticalSection 功能,在執(zhí)行訪問(wèn)被保護(hù)資源的任何代碼段之前,請(qǐng)求危險(xiǎn)區(qū)段的所有權(quán)。


#include <windows.h>

#include <iostream>

using namespace std;

DWORD WINAPI Fun1Proc(LPVOID lpParameter);

DWORD WINAPI Fun2Proc(LPVOID lpParameter);

int tickets=100;

CRITICAL_SECTION g_csA;

CRITICAL_SECTION g_csB;

void main()

{

HANDLE hThread1;

HANDLE hThread2;

hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);

hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);

CloseHandle(hThread1);

CloseHandle(hThread2);

InitializeCriticalSection(&g_csA);

InitializeCriticalSection(&g_csB);

Sleep(40000);

DeleteCriticalSection(&g_csA);

DeleteCriticalSection(&g_csB);

}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)

{

while (TRUE)

{

EnterCriticalSection(&g_csA);

Sleep(1);

//EnterCriticalSection(&g_csB);//臨界區(qū)的同步和互鎖

if (tickets>0)

{

   Sleep(1);

   cout<<"Thread1 sell ticket :"<<tickets--<<endl;

   //LeaveCriticalSection(&g_csB);

   LeaveCriticalSection(&g_csA);

}

else

{

   //LeaveCriticalSection(&g_csB);

   LeaveCriticalSection(&g_csA);

   break;

}

}

return 0;

}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)

{

while (TRUE)

{

EnterCriticalSection(&g_csB);

Sleep(1);

EnterCriticalSection(&g_csA);

if (tickets>0)

{

   Sleep(1);

   cout<<"Thread2 sell ticket :"<<tickets--<<endl;

   LeaveCriticalSection(&g_csA);

   LeaveCriticalSection(&g_csB);

}

else

{

   LeaveCriticalSection(&g_csA);

   LeaveCriticalSection(&g_csB);

   break;

}

}

return 0;

}


--------------------------------------------------------------------------------

二、使用互斥對(duì)象
DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
如果時(shí)間是有信號(hào)狀態(tài)返回WAIT_OBJECT_0,如果時(shí)間超過(guò)dwMilliseconds值但時(shí)間事件還是無(wú)信號(hào)狀態(tài)則返回WAIT_TIMEOUT
WaitForSingleObject函數(shù)用來(lái)檢測(cè)hHandle事件的信號(hào)狀態(tài),當(dāng)函數(shù)的執(zhí)行時(shí)間超過(guò)dwMilliseconds就返回,但如果參數(shù)dwMilliseconds為INFINITE時(shí)函數(shù)將直到相應(yīng)時(shí)間事件變成有信號(hào)狀態(tài)才返回,否則就一直等待下去,直到WaitForSingleObject有返回直才執(zhí)行后面的代碼。

#include <windows.h>

#include <iostream>

using namespace std;

DWORD WINAPI Fun1Proc(LPVOID lpParameter);

DWORD WINAPI Fun2Proc(LPVOID lpParameter);

int index =0;

int tickets=100;

HANDLE hMutex;

void main()

{

HANDLE hThread1;

HANDLE hThread2;

//創(chuàng)建線程

hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);

hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);

CloseHandle(hThread1);

CloseHandle(hThread2);

//**************************************************************

//保證應(yīng)用程序只有一個(gè)實(shí)例運(yùn)行,創(chuàng)建一個(gè)命名的互斥對(duì)象.

hMutex=CreateMutex(NULL,TRUE,LPCTSTR("tickets"));

//創(chuàng)建時(shí)主線程擁有該互斥對(duì)象,互斥對(duì)象的線程ID為主線程的ID,同時(shí)將該互斥對(duì)象內(nèi)部計(jì)數(shù)器置為1

if (hMutex)

{

if (ERROR_ALREADY_EXISTS==GetLastError())

{

   cout<<"only one instance can run!"<<endl;

   //Sleep(40000);

   return;

}

}

//**************************************************************

WaitForSingleObject(hMutex,INFINITE);

//使用該函數(shù)請(qǐng)求互斥對(duì)象時(shí),雖說(shuō)該對(duì)象處于無(wú)信號(hào)狀態(tài),但因?yàn)檎?qǐng)求的線程ID和該互斥對(duì)象所有者的線程ID是相同的.所以仍然可以請(qǐng)求到這個(gè)互斥對(duì)象,于是該互斥對(duì)象內(nèi)部計(jì)數(shù)器加1,內(nèi)部計(jì)數(shù)器的值為2. 意思是有兩個(gè)等待動(dòng)作

ReleaseMutex(hMutex);//釋放一次互斥對(duì)象,該互斥對(duì)象內(nèi)部計(jì)數(shù)器的值遞減1,操作系統(tǒng)不會(huì)將這個(gè)互斥對(duì)象變?yōu)橐淹ㄖ獱顟B(tài).

ReleaseMutex(hMutex);//釋放一次互斥對(duì)象,該互斥對(duì)象內(nèi)部計(jì)數(shù)器的值為0,同時(shí)將該對(duì)象設(shè)置為已通知狀態(tài).

//對(duì)于互斥對(duì)象來(lái)說(shuō),誰(shuí)擁有誰(shuí)釋放

Sleep(40000);

}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)

{

while (TRUE)

{

WaitForSingleObject(hMutex,INFINITE);//等待互斥對(duì)象有信號(hào)

if (tickets>0)

{

   Sleep(1);

   cout<<"thread1 sell ticket :"<<tickets--<<endl;

}

else

   break;

ReleaseMutex(hMutex);//設(shè)置該互斥對(duì)象的線程ID為0,并且將該對(duì)象設(shè)置為有信號(hào)狀態(tài)

}

return 0;

}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)

{

while (TRUE)

{

WaitForSingleObject(hMutex,INFINITE);

if (tickets>0)

{

   Sleep(1);

   cout<<"thread2 sell ticket :"<<tickets--<<endl;

}

else

   break;

ReleaseMutex(hMutex);

}

return 0;


三、使用事件對(duì)象
HANDLE     CreateEvent(  
        LPSECURITY_ATTRIBUTES     lpEventAttributes,           //     SD  
        BOOL     bManualReset,                                                 //     reset     type  
        BOOL     bInitialState,                                                     //     initial     state  
        LPCTSTR     lpName                                                      //     object     name  
    );  
    該函數(shù)創(chuàng)建一個(gè)Event同步對(duì)象,并返回該對(duì)象的Handle  
   
    lpEventAttributes     一般為NULL  
    bManualReset               創(chuàng)建的Event是自動(dòng)復(fù)位還是人工復(fù)位     ,如果true,人工復(fù)位,  
    一旦該Event被設(shè)置為有信號(hào),則它一直會(huì)等到ResetEvent()API被調(diào)用時(shí)才會(huì)恢復(fù)  
    為無(wú)信號(hào).     如果為false,Event被設(shè)置為有信號(hào),則當(dāng)有一個(gè)wait到它的Thread時(shí),  
    該Event就會(huì)自動(dòng)復(fù)位,變成無(wú)信號(hào).  
    bInitialState             初始狀態(tài),true,有信號(hào),false無(wú)信號(hào)  
    lpName                           Event對(duì)象名  
   
    一個(gè)Event被創(chuàng)建以后,可以用OpenEvent()API來(lái)獲得它的Handle,用CloseHandle()  
    來(lái)關(guān)閉它,用SetEvent()或PulseEvent()來(lái)設(shè)置它使其有信號(hào),用ResetEvent()  
    來(lái)使其無(wú)信號(hào),用WaitForSingleObject()或WaitForMultipleObjects()來(lái)等待  
    其變?yōu)橛行盘?hào).  
   
    PulseEvent()是一個(gè)比較有意思的使用方法,正如這個(gè)API的名字,它使一個(gè)Event  
    對(duì)象的狀態(tài)發(fā)生一次脈沖變化,從無(wú)信號(hào)變成有信號(hào)再變成無(wú)信號(hào),而整個(gè)操作是原子的.  
    對(duì)自動(dòng)復(fù)位的Event對(duì)象,它僅釋放第一個(gè)等到該事件的thread(如果有),而對(duì)于  
    人工復(fù)位的Event對(duì)象,它釋放所有等待的thread.

#include <windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
int tickets=100;
HANDLE g_hEvent;

void main()
{
HANDLE hThread1;
HANDLE hThread2;
//**************************************************
//創(chuàng)建一個(gè)命名的自動(dòng)重置事件內(nèi)核對(duì)象
g_hEvent=CreateEvent(NULL,FALSE,FALSE,LPCTSTR("tickets"));
if (g_hEvent)
{
if (ERROR_ALREADY_EXISTS==GetLastError())
{
   cout<<"only one instance can run!"<<endl;
   return;
}
}
//**************************************************
SetEvent(g_hEvent);
//創(chuàng)建線程
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);

Sleep(40000);
//關(guān)閉事件對(duì)象句柄
CloseHandle(g_hEvent);
}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(g_hEvent,INFINITE);
//ResetEvent(g_hEvent);
if (tickets>0)
{
   Sleep(1);
   cout<<"thread1 sell ticket :"<<tickets--<<endl;
   SetEvent(g_hEvent);
}
else
{
   SetEvent(g_hEvent);
   break;
}
}
return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(g_hEvent,INFINITE);
//ResetEvent(g_hEvent);
if (tickets>0)
{
   cout<<"Thread2 sell ticket :"<<tickets--<<endl;
   SetEvent(g_hEvent);
}
else
{
   SetEvent(g_hEvent);
   break;
}
}
return 0;


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
MFC(線程同步與異步套接字,孫鑫
孫鑫VC視頻教程筆記之第十六課(上)“線程同步”
CC++語(yǔ)言27|多線程編程
Windows下C++多線程同步與互斥簡(jiǎn)單運(yùn)用
多線程同步-event
編程思想之多線程與多進(jìn)程(4):C 中的多線程 - 博客 - 伯樂(lè)在線
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服