VC C++ 線程同步的方法

1. CriticalSection

2. Event     CreateEvent

3. 互斥對象  CreateMutex   互斥對象還可以實現進程間的同步。實現一個進程的運行。   GetLastError() = Error_Already_Exists .....


進程間的同步

1.   郵件槽 CreateMailSlot 

   優缺點:

            1. 發送的是數據報,使用的是UDP協議不可靠連接。

           2. 使能單向傳送數據,只能從客戶端到服務器端,客戶端寫,服務器端讀。 

           3. 不能超過400KB數據

            4. 可以一個客戶端到多個服務器發送。

 

    命名管道

    createNamePipe   connectNamePipe

    優缺點

      1. 發送的數據流,使用的TCP協議,可靠連接。

      2. 雙向發送數據,能讀能寫。

      3. 數據沒有限制

     


    匿名管道       只能被用在父進程與子進程之間進行數據通信。與命名管道相比,匿名管道不能被使用在網絡進程之間。


子進程.exe


int _tmain(int argc, _TCHAR* argv[])
{
HANDLE read = NULL;
char text[100] = {0};
DWORD readtext;
read = GetStdHandle(STD_INPUT_HANDLE);


if (ReadFile(read, text,100,&readtext,NULL))
{
printf("從匿名管道中讀取的數據是%s\r\n",text);
}

return 0;
}




int _tmain(int argc, _TCHAR* argv[])
{
HANDLE read = NULL, write = NULL;
SECURITY_ATTRIBUTES ss;
STARTUPINFO sa = {0};
PROCESS_INFORMATION pp = {0};
char text[] = "匿名管道程序測試!";
DWORD writetext;
ss.nLength = sizeof ss;
ss.lpSecurityDescriptor = NULL;
ss.bInheritHandle =TRUE;


if (CreatePipe(&read,&write, &ss,0))
{
cout << "創建匿名管道成功\r\n" <<endl;
sa.cb = sizeof(sa);
sa.dwFlags = STARTF_USESHOWWINDOW;
sa.hStdInput  = read;
sa.hStdOutput = write;
sa.hStdError = GetStdHandle(STD_ERROR_HANDLE);
if (::CreateProcess(NULL,_T("紫禁城.exe"),NULL,NULL,TRUE,0, NULL,NULL, &sa,&pp))
{
printf("創建紫禁城成功\r\n");
WriteFile(write,text,sizeof(text),&writetext,NULL);
printf("通過匿名管道寫入數據成功\r\n");
}




}


return 0;
}


                                       


發佈了61 篇原創文章 · 獲贊 60 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章