在C++中,管道和套接字通常用于进程间通信,但也可以在同一进程内的不同线程之间进行通信。下面是一个示例,演示了如何在C++中使用管道来实现线程通信:
#include <iostream>
#include <thread>
#include <unistd.h> // POSIX标准头文件
#include <fcntl.h> // 文件控制操作
void readFunction(int fd) {
char buffer[256];
ssize_t bytesRead;
while (true) {
// 读取管道中的数据
bytesRead = read(fd, buffer, sizeof(buffer));
if (bytesRead == -1) {
std::cerr << "Error reading from pipe" << std::endl;
break;
}
if (bytesRead == 0) {
std::cout << "Pipe closed by writer" << std::endl;
break;
}
std::cout << "Reader received: " << buffer << std::endl;
}
}
void writeFunction(int fd) {
const char* message = "Hello from writer!";
ssize_t bytesWritten = write(fd, message, strlen(message) + 1);
if (bytesWritten == -1) {
std::cerr << "Error writing to pipe" << std::endl;
} else {
std::cout << "Writer sent: " << message << std::endl;
}
// 关闭管道写端,通知读线程管道已关闭
close(fd);
}
int main() {
int pipefd[2];
if (pipe(pipefd) == -1) {
std::cerr << "Error creating pipe" << std::endl;
return 1;
}
// 创建读线程
std::thread reader(readFunction, pipefd[0]);
// 创建写线程
std::thread writer(writeFunction, pipefd[1]);
// 等待线程执行完成
reader.join();
writer.join();
return 0;
}
在这个示例中,我们使用 pipe() 函数创建了一个管道,并通过文件描述符 pipefd 来访问管道的读端和写端。然后,我们创建了两个线程:一个读线程和一个写线程。读线程通过管道的读端从管道中读取数据,写线程通过管道的写端向管道中写入数据。最后,我们等待两个线程执行完成,并在主线程中关闭了管道的写端,通知读线程管道已关闭。
这样就实现了通过管道在两个线程之间进行通信。需要注意的是,管道是半双工的,因此需要分别创建读端和写端,并确保只有一个线程写入管道,另一个线程读取管道。