我正在用线程和管道编写一个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;
}
1条答案
按热度按时间ffscu2ro1#
您正在
fgets()
中进行分段,因为FH
为NULL,因为fdopen()
因EINVAL而失败,因为您正在尝试将管道(v[1]
)的 write 结尾fdopen()
为可读("r"
)stdio流。