C pthread_创建int而不是void
我有以下代码:C pthread_创建int而不是void,c,pthreads,C,Pthreads,我有以下代码: for(i = 0 ; i < max_thread; i++) { struct arg_struct args; args.arg1 = file; args.arg2 = word; args.arg3 = repl; if(pthread_create(&thread_id[i],NULL,&do_process,&args) != 0) { i--; fprin
for(i = 0 ; i < max_thread; i++)
{
struct arg_struct args;
args.arg1 = file;
args.arg2 = word;
args.arg3 = repl;
if(pthread_create(&thread_id[i],NULL,&do_process,&args) != 0)
{
i--;
fprintf(stderr,RED "\nError in creating thread\n" NONE);
}
}
for(i = 0 ; i < max_thread; i++)
if(pthread_join(thread_id[i],NULL) != 0)
{
fprintf(stderr,RED "\nError in joining thread\n" NONE);
}
int do_process(void *arguments)
{
//code missing
}
for(i=0;i
*如何将(void*)do\u进程转换为(int)do\u进程?*
该函数返回非常重要的信息,没有这些返回,我不知道如何读取回复
我得到了以下错误:警告:传递'pthread_create'的arg 3会使指针从整数变为不带强制转换的指针只需编写一个正确类型的帮助函数,但它所做的只是获取void*输入参数,从中获取所有正确的参数,调用函数,获取该参数的返回值,并将其打包为一个void*以便pthread_join获取
对于你的具体问题,你不能/不应该。只要照我上面所说的去做,你就会变成黄金。线程函数返回一个指针。至少,您可以动态分配一个整数并返回它
void * do_process (void *arg) {
/* ... */
int *result = malloc(sizeof(int));
*result = the_result_code;
return result;
}
然后,您可以从thread\u join()
调用中恢复此指针
void *join_result;
if(pthread_join(thread_id[i],&join_result) != 0)
{
fprintf(stderr,RED "\nError in joining thread\n" NONE);
} else {
int result = *(int *)join_result;
free(join_result);
/* ... */
}
pthread_join()是两个线程之间通信的一种简单方式。它有两个局限性。首先,它只能从指针传递一个值(可以将其设为指针并存储多个值)。其次,您只能在线程全部完成时返回它——返回此值后,线程进入终止状态。因此,如果您希望线程以更细粒度的方式进行通信,那么使用公共共享数据将更好地为您服务。当然,至少,您需要使用Pthread mutex来同步对公共数据的访问。而且,如果您想让线程彼此通信,那么还需要使用Pthread condvars。我不认为至少可以显示
do\u process
的声明?但除此之外,还有什么原因不能将arg_结果
放入args
结构并用它传递返回结果吗?将返回值放入args
并返回它。您可以在返回时询问args
。使用pthread\u join
中的第二个参数。我认为这是一个好主意。pthread_中的第二个参数加入了什么?我将该值设置为NULL。但do_进程不返回void*,它返回int。我猜从技术上讲,他并没有说它不能更改,但他也从来没有说它可以更改。我不认为。他问“我如何将(void*)do_进程转换为(int)do_进程”,这可能意味着几件事。但我的答案是,传递给pthread\u create()
的函数返回一个void*
,因此返回一个。我尝试了,它正确地发送了返回,但它对所有启动的线程使用相同的值(file、word、repl)。我怎样才能避免这种情况?谢谢,如果在我的示例中,result\u code
被替换为rand()
,那么每次加入后,result
肯定会包含随机值。因此,如果您得到相同的值,那是因为您的代码返回相同的值。尝试编译并运行。