我有以下代码:
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
}
* 如何将(void *)do_process转换为(int)do_process?*
该函数返回非常重要的信息,如果没有这些返回,我不知道如何阅读回复
我收到以下错误:警告:传递`pthread_create'的arg 3从没有强制转换的整数中生成指针
答案 0 :(得分:2)
线程函数返回一个指针。至少,您可以动态分配一个整数并将其返回。
void * do_process (void *arg) {
/* ... */
int *result = malloc(sizeof(int));
*result = the_result_code;
return result;
}
然后,您可以从thread_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);
/* ... */
}
答案 1 :(得分:1)
只需编写一个类型正确的辅助函数,但它所做的就是获取void *输入参数,从中获取所有正确的参数,调用函数,返回函数并将其打包作为pthread_join获取的void *。
对于您的具体问题,您不能/不应该。只要做我上面概述的内容,你就会变得金黄。
答案 2 :(得分:0)
pthread_join()是两个线程之间进行通信的简单方法。它有两个局限。首先,它只能从指针传递一个值(您可以将其作为指针并存储多个值)。其次,只有在线程全部完成后才能返回 - 在返回此值后,线程进入终止状态。因此,如果您希望线程以更精细的方式进行通信,则可以更好地使用公共共享数据。当然,至少在某种程度上,您可以使用Pthread互斥锁来同步对公共数据的访问。并且,如果您希望线程彼此通信,那么您还需要使用Pthread condvars。