使用C++中的pthread与共享变量进行多线程处理

Cla*_*ent 1 c++ multithreading pthreads parameter-passing

我是新线程(和C/C++),我试图使用多个线程来访问共享变量.

在主要的,我创建了一个变量char inputarray [100];

线程1:该线程将以2字节突发从stdin读取数据,并将它们附加到inputarray.(通过输入文件输入)

线程2:该线程将一次读取1个字节的数据,执行计算,并将其数据放入输出数组.

线程3:该线程将以2字节突发的形式从输出数组输出数据.(标准输出)

我已经尝试了输入部分并通过传递结构使其工作,但是想要在不使用结构的情况下完成它,但它一直给我带来问题.

如果我可以输入,我相信我将能够使用类似的策略来完成输出.任何帮助将不胜感激.

下面是输入线程的粗略模板.

#include <stdio.h>
#include <pthread.h>

using namespace std;

void* input(void* arg) {
    char reading[3];
    fread(reading,1,2,stdin);

    //append to char inputarray[]..???
}

int main() {
    char inputarray[100];
    pthread_t t1;
    pthread_create(&t1, NULL, &input, &inputarray);
    void *result;
    pthread_join(t1,&result);
    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

nog*_*ard 8

几个问题:

  1. 我认为堆栈上的数组是共享变量的非常糟糕的选择,因为它具有固定的大小,并且从线程2和3中不清楚在哪里放置新元素或从哪里读取元素.我建议使用std::vectorstd::deque代替.最初你的容器是空的.然后线程2将一些元素推送到它.线程3轮询(或等待条件变量)容器,一旦找到新元素 - 打印它们

  2. 您必须使用互斥锁同步对共享变量的访问(请考虑pthread互斥锁,std::mutexboost::mutex).您可能还希望使用条件变量来通知线程3队列中的新元素.但是对于初始实施,它不是必需的.

  3. 你真的必须使用pthread原语吗?通常情况下,它更容易和更安全(即异常安全)std::thread,std::mutex(如果你有现代编译器),或者boost::thread,boost::mutex否则.