c++ 管道和线程在完成前退出的程序

pprl5pva  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(127)

我正在用线程和管道编写一个c++程序。我正在实现一个并行算法,其思想是我有一个向子线程写入数据的主线程。子线程必须读取这些数据,处理它,并将结果写回主线程。
我已经剥离了通信核心逻辑的最小复制、编译版本,并注解掉了我有更多代码的地方。程序运行和退出时无需完整键入。通常,打印的i的最后一个值在1和9之间,并且程序不做任何说明就终止。我希望程序运行完成,但我没有得到任何错误,程序优雅地退出,所以我不确定如何调试。
注意:管道和Pthreads是从其他地方强制的,并且是硬要求。请不要建议使用std::thread或只是在同一地址空间内的线程之间通信的解决方案。

#include <iostream>
#include "pthread.h"
#include "unistd.h"
#include <vector>

using namespace std;
void* func (void* args)
{
    std::vector<int> v = * (std::vector<int>*)(args);
    auto FH = fdopen(v[0], "r");
    char buffer[1024];
    int buffer_len = 1024;
    while (fgets(buffer, buffer_len, FH))
    {
        std::string x{buffer};
    }
    
    // process the result and return it to the parent
    
    return NULL;
    
    
}

int main()
{
    std::vector<std::vector<int> *> pipes{};
    std::vector<pthread_t *> threads{};
    for (int i=0; i<20; i++)
    {
        std::cout<<i<<std::endl;
        int fd[2];
        if (pipe(fd) < 0)
        {
            std::cout<<"failed"<<std::endl;
            exit(0);
        }
        int fd2[2];
        if (pipe(fd2) < 0)
        {
            std::cout<<"failed"<<std::endl;
            exit(0);
        }
        std::vector<int> *pipe_info = new std::vector<int>{fd[0], fd[1], fd2[0], fd2[1]};
        auto F = fdopen(fd[1], "w");
        pthread_t *thread = new pthread_t;
        threads.push_back(thread);
        pipes.push_back(pipe_info);
        pthread_create(thread, NULL, func, (void*) pipe_info);
        for (int i=0; i<100; i++)
            fprintf(F, "%d", 3);
    }
    
    
    
    // read the data returned from the child threads 
    // using fd2 (indices 2,3) in each pipe in pies.
    // free all allocated memory
    
    
    for (auto thread: threads)
    {
        pthread_join(*thread, NULL);
        delete thread;
    }
    std::cout<<"complete"<<std::endl;

    return 0;
}
ffscu2ro

ffscu2ro1#

您正在fgets()中进行分段,因为FH为NULL,因为fdopen()因EINVAL而失败,因为您正在尝试将管道(v[1])的 write 结尾fdopen()为可读("r")stdio流。

相关问题