VC C++ 线程同步的方法

来源:互联网 发布:学霸通软件下载 编辑:程序博客网 时间:2024/05/18 16:17

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;
}


                                       


0 0