我有一个结构
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,
我在这里遗漏了什么? 提前谢谢!
答案 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;
....
}
谢谢大家的时间!