管道和套接字实现线程通信

33 阅读2分钟

在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 来访问管道的读端和写端。然后,我们创建了两个线程:一个读线程和一个写线程。读线程通过管道的读端从管道中读取数据,写线程通过管道的写端向管道中写入数据。最后,我们等待两个线程执行完成,并在主线程中关闭了管道的写端,通知读线程管道已关闭。

这样就实现了通过管道在两个线程之间进行通信。需要注意的是,管道是半双工的,因此需要分别创建读端和写端,并确保只有一个线程写入管道,另一个线程读取管道。