Pthread 参数传递
Pthread Argument Passing
我尝试创建一个 pthread,然后在 运行 我的 readIn 函数之后记录一段时间,但是当我在 main 中打印时间时,它显示为一个不正确的值。我是线程的新手,我不知道我是否以正确的方式传递参数。任何见解将不胜感激。
int main(int argc, char **argv){
int read;
pthread_t readerThread;
ReadWrite arglist;
arglist.fileName= inputFile;
arglist.rVal=(RetVal *) malloc(sizeof(struct RetVal));
read= pthread_create(&readerThread, NULL, readIn, (void *) &arglist );
cout << "Total time for reading: "<< (arglist.rVal)->timeUsed << endl;
}
struct ReadWrite {
string fileName;
RetVal * rVal;
} ;
struct RetVal{
int frequency;
double timeUsed;
};
void * readIn(void *arg)
{
struct timeval now, later;
gettimeofday(&now, NULL);
ReadWrite* aList = static_cast<ReadWrite *>(arg);
RetVal *rVal = aList->rVal;
string fileName = aList->fileName;
.....
.....
.....
rVal->frequency = dataSet.size();
rVal->timeUsed = getTimeUsed(now, later);
cout << "Correct time: " << dataSet.size(); << endl;
pthread_exit(NULL);
}
**OUTPUT**
Total CPU time for reading: -1.72723e-77
Correct time: 22841
您没有任何时间将您的线程交给 运行 - main 中的打印输出甚至可能在您的线程函数启动之前发生,或者就在中间。所以你有数据竞争和未定义的行为。
您应该等待线程完成,然后再对 main
中的结果执行任何操作。为此使用 pthread_join
。
(C++11 还有一个线程库 <thread>
你应该看看,你可以用它来避免那些丑陋的转换。)
我尝试创建一个 pthread,然后在 运行 我的 readIn 函数之后记录一段时间,但是当我在 main 中打印时间时,它显示为一个不正确的值。我是线程的新手,我不知道我是否以正确的方式传递参数。任何见解将不胜感激。
int main(int argc, char **argv){
int read;
pthread_t readerThread;
ReadWrite arglist;
arglist.fileName= inputFile;
arglist.rVal=(RetVal *) malloc(sizeof(struct RetVal));
read= pthread_create(&readerThread, NULL, readIn, (void *) &arglist );
cout << "Total time for reading: "<< (arglist.rVal)->timeUsed << endl;
}
struct ReadWrite {
string fileName;
RetVal * rVal;
} ;
struct RetVal{
int frequency;
double timeUsed;
};
void * readIn(void *arg)
{
struct timeval now, later;
gettimeofday(&now, NULL);
ReadWrite* aList = static_cast<ReadWrite *>(arg);
RetVal *rVal = aList->rVal;
string fileName = aList->fileName;
.....
.....
.....
rVal->frequency = dataSet.size();
rVal->timeUsed = getTimeUsed(now, later);
cout << "Correct time: " << dataSet.size(); << endl;
pthread_exit(NULL);
}
**OUTPUT**
Total CPU time for reading: -1.72723e-77
Correct time: 22841
您没有任何时间将您的线程交给 运行 - main 中的打印输出甚至可能在您的线程函数启动之前发生,或者就在中间。所以你有数据竞争和未定义的行为。
您应该等待线程完成,然后再对 main
中的结果执行任何操作。为此使用 pthread_join
。
(C++11 还有一个线程库 <thread>
你应该看看,你可以用它来避免那些丑陋的转换。)