使用c++给出一个可以在windows环境下Visual Studio编译环境下可以运行的并发程序设计例子要求完成一个父进程创建两个子进程,使用三程序三进程完成
时间: 2024-03-05 09:51:00 浏览: 131
使用Microsoft Visual C ++进行并行编程(英文)
以下是一个可以在Windows环境下使用Visual Studio编译环境运行的并发程序设计例子,该例子使用了三个程序和三个进程,其中一个父进程和两个子进程:
父进程:
```c++
#include <Windows.h>
#include <iostream>
int main()
{
// 创建两个匿名管道,用于与子进程通信
HANDLE hReadPipe1, hWritePipe1, hReadPipe2, hWritePipe2;
SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
if (!CreatePipe(&hReadPipe1, &hWritePipe1, &sa, 0) ||
!CreatePipe(&hReadPipe2, &hWritePipe2, &sa, 0))
{
std::cerr << "Failed to create pipe!" << std::endl;
return 1;
}
// 创建第一个子进程
STARTUPINFO si1 = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION pi1;
si1.hStdError = hWritePipe1;
si1.hStdOutput = hWritePipe1;
si1.dwFlags |= STARTF_USESTDHANDLES;
if (!CreateProcess(NULL, "child1.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si1, &pi1))
{
std::cerr << "Failed to create process 1!" << std::endl;
return 1;
}
// 创建第二个子进程
STARTUPINFO si2 = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION pi2;
si2.hStdError = hWritePipe2;
si2.hStdOutput = hWritePipe2;
si2.dwFlags |= STARTF_USESTDHANDLES;
if (!CreateProcess(NULL, "child2.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si2, &pi2))
{
std::cerr << "Failed to create process 2!" << std::endl;
return 1;
}
// 关闭父进程中的管道句柄
CloseHandle(hReadPipe1);
CloseHandle(hWritePipe1);
CloseHandle(hReadPipe2);
CloseHandle(hWritePipe2);
// 等待子进程结束
WaitForSingleObject(pi1.hProcess, INFINITE);
WaitForSingleObject(pi2.hProcess, INFINITE);
// 关闭子进程句柄
CloseHandle(pi1.hProcess);
CloseHandle(pi1.hThread);
CloseHandle(pi2.hProcess);
CloseHandle(pi2.hThread);
return 0;
}
```
第一个子进程:
```c++
#include <Windows.h>
#include <iostream>
int main()
{
// 读取从父进程传递过来的管道数据
char buffer[1024];
DWORD bytesRead;
HANDLE hReadPipe = GetStdHandle(STD_INPUT_HANDLE);
if (!ReadFile(hReadPipe, buffer, sizeof(buffer), &bytesRead, NULL))
{
std::cerr << "Failed to read pipe!" << std::endl;
return 1;
}
// 输出数据到控制台
std::cout << "Child process 1 received: " << buffer << std::endl;
return 0;
}
```
第二个子进程:
```c++
#include <Windows.h>
#include <iostream>
int main()
{
// 读取从父进程传递过来的管道数据
char buffer[1024];
DWORD bytesRead;
HANDLE hReadPipe = GetStdHandle(STD_INPUT_HANDLE);
if (!ReadFile(hReadPipe, buffer, sizeof(buffer), &bytesRead, NULL))
{
std::cerr << "Failed to read pipe!" << std::endl;
return 1;
}
// 输出数据到控制台
std::cout << "Child process 2 received: " << buffer << std::endl;
return 0;
}
```
在这个例子中,父进程创建了两个匿名管道,然后分别启动了两个子进程。当子进程启动后,它们会从管道中读取数据,并将读取到的数据输出到控制台。
你可以根据自己的需求修改这个例子,例如使用信号量、互斥体等同步机制,或者使用更复杂的进程间通信方式,例如共享内存、消息队列等。
阅读全文