我有一个方法是将信息写入结构体。我想让它作为一个线程运行。
如果我单独调用它,则childWriter((void*) &sa)
可以正常工作。
如果我拨打pthread_create(&writerChild, NULL, childWriter, (void*) &sa)
,它就不再有效了。它不会写入共享对象。
这让我很生气。为什么它不起作用,我该如何使它工作?
答案 0 :(得分:3)
是什么让您确信代码不会执行?请注意,如果您执行以下操作:
int main(int argc, char* argv[])
{
pthread_create(....);
return 0;
}
在上面,程序将立即退出,因为程序会在主线程终止后立即退出。你需要“加入”线程(使用pthread_join),以便等待线程终止。请注意,生成一个线程然后加入它实际上比简单地运行线程将运行的内容更糟糕(因为产生然后加入一个线程相当于串行运行内容,加上它增加了spawn / join的开销)。如果你打算多线程,通常会生成多个线程,然后分离它们或稍后加入它们。
此外,您应该谨慎对待可以修改的线程之间的数据共享;从多个线程读取并在一个线程中修改的任何对象都需要显式锁定对该对象的访问。否则,你可能会遇到各种各样的垃圾和腐败。
答案 1 :(得分:0)
简短版:
在从结构中读取数据之前使用pthread_join()
:
pthread_create(&writerChild, NULL, childWriter, (void*) &sa);
//if necessary, do some other tasks, not related to the struct, here
pthread_join(writerChild,NULL);
//now, you may read from the struct
如果您在一个功能中创建线程,&在另一个函数中读取结构,只需在从结构读取之前将pthread_join语句转换为后者。 (还要确保pthread_t变量writerChild在读取函数的范围内可见)
长版:
线程通常用于可以并行化任务的程序中。我想你的意图是在childWriter函数写入之后读取写入结构的数据。
当您在单线程进程中调用函数时,请通过:
childWriter((void*) &sa);
线程/进程转移以执行作为函数一部分的指令。只有在函数返回时,执行控制才会返回到调用函数的点。因此,在开始从调用函数中的结构读取之前,您可以确定childWriter已完成其执行。
创建新主题时,请通过:
pthread_create(&writerChild, NULL, childWriter, (void*) &sa);
该线程与您的“主”线程并行运行。无法保证在主线程中的下一条指令被执行之前,新创建的线程将有机会执行,单独留下childWriter
线程函数在读取结构之前完成其执行的可能性。
因此,您需要等待线程完成其执行。这可以使用pthread_join()
完成。