operator =不适用于fstream

时间:2016-07-30 08:37:08

标签: c++ multithreading c++11 fstream

我有一个结构

struct myStruct {
    fstream fp;
    char *buffer;
    size_t size;
};

我是C ++的新手并尝试编写一个代码,其中一个线程将从一个文件读入缓冲区,主线程将缓冲区写入其他文件。代码示例如下:

int main() {
    pthread tid1;
    struct myStruct readArgs;
    fstream fileP, fileP2;
    fileP.open("/tmp/20MBFile", fstream::in);
    fileP2.open("/tmp/trial-file", fstream::out);
    char *buffer;
    readArgs.fp = fileP;
    readArgs.buffer = buffer;
    readArgs.size = 1048576;
    pthread_create(&tid1, NULL, Read, &readArgs);
    pthread_join(tid1, NULL);
    fileP2.write(buffer, 1048576);
    ......
}

读取功能如下:

void *Read(struct myStruct *readArgs) {
    readArgs->fp.read(readArgs->buffer, readArgs->size);
    pthread_exit(NULL);
}

然而,当我编译我的代码时,我得到以下错误:

  

错误:使用已删除的功能&#st; :: basic_fstream& std :: basic_fstream :: operator =(const std :: basic_fstream&)'        readArgs.fp = fileP;

AND

  

错误:来自' void *()(myStruct )的转换无效' to' void *()(void )' [-fpermissive]        pthread_create(& tid1,NULL,Read,& readArgs);                                                   ^   在/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../include/c++/4.8.3/x86_64-redhat-linux/bits/gthr中包含的文件中-default.h:35:0,                    来自/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../include/c++/4.8.3/x86_64-redhat-linux/bits/gthr.h: 148,                    来自/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../include/c++/4.8.3/ext/atomicity.h:35,                    来自/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../include/c++/4.8.3/bits/ios_base.h:39,                    来自/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../include/c++/4.8.3/ios:42,                    来自/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../include/c++/4.8.3/ostream:38,                    来自/ usr / lib / gcc / x86_64-redhat-
  ....
  /usr/include/pthread.h:232:12:错误:初始化' int pthread_create的参数3(pthread_t *,const pthread_attr_t *,void *()(void ),void * )' [-fpermissive]    extern int pthread_create(pthread_t * __ restrict __newthread,

我在这里遗漏了什么? 提前谢谢!

1 个答案:

答案 0 :(得分:0)

找到答案..
1. fstream - fstream无法使用=进行分配,但可以移动。由于swap()版本,gcc也无效。我有gcc版本4.8.3.x,我想这不支持swap() fstream的调用 2. pthread_create() - 它需要带有签名void *foo(void *)的函数,因此必须传递必需的参数并在所需函数中进行类型转换。
我会这样做:

pthread_create(&tid1, NULL, Read, &readArgs);

Read()函数将是:

void *Read(void *args) {
    myStruct *readA = (myStruct *)args;  
    ....
}  

谢谢大家的时间!