将 int 函数转换为 void*
Casting int function to void*
我在将返回的整数值转换为 void 指针时遇到问题。已从该站点尝试了一些选项,但我的问题似乎仍未解决。尽管程序编译时没有代码错误,但我遇到了分段错误。我是不是瞎了,我的代码有没有错误?
#include<pthread.h>
#include<stdio.h>
#include<stdint.h>
int ackermann(int a, int b)
{
if(a==0)
return a+1;
else if(a>0 && b==0)
{
return ackermann(a-1, 1);
}
else if(a>0 && b>0)
{
return ackermann(a-1,ackermann(a,(b-1)));
}
}
int main(int argc, char* argv[])
{
int a = atoi(argv[1]);
int b = atoi(argv[2]);
int c = ackermann(a,b);
void *ptr = &c;
pthread_t mythread;
if(pthread_create(&mythread, NULL, ptr, NULL))
{
printf("Could not create a thread\n");
}
pthread_exit(NULL);
return 0;
}
如评论中所述,您实际上并未在单独的线程中调用函数 ackermann
。您正在做的是直接从 main
调用该函数,将结果存储在 int
中,并将指向该 int
的指针作为第三个参数传递给 pthread_create
,这应该是指向 运行.
函数的指针
现在,ackermann
没有合适的签名可以传递给 pthread_create
。启动新线程的函数应该这样声明:
void *my_thread_function(void *parameter);
鉴于 ackermann
被递归调用,将包装函数传递给 pthread_create
并让该包装函数调用 ackermann
而不是将 ackermann
修改为匹配上面的签名。
因为您需要将多个参数传递给您的线程函数,所以您需要创建一个包含所有参数的 struct
并将指向该 struct
的指针传递给线程函数。
您还可以将 return 值存储在此结构中,以便启动线程的函数可以访问它。
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
int ackermann(int a, int b)
{
if(a==0) {
return a+1;
} else if(a>0 && b==0) {
return ackermann(a-1, 1);
} else if(a>0 && b>0) {
return ackermann(a-1,ackermann(a,(b-1)));
}
// if none of the above conditions are true, no value is returned
// better check for this
}
struct ackermann_params {
int a;
int b;
int result;
};
void *ackermann_thr(void *arg)
{
struct ackermann_params *params = arg;
params->result = ackermann(params->a, params->b);
return NULL;
}
int main(int argc, char* argv[])
{
struct ackermann_params params;
if (argc < 3) {
printf("invalid number of arguments\n");
exit(1);
}
params.a = atoi(argv[1]);
params.b = atoi(argv[2]);
pthread_t mythread;
if(pthread_create(&mythread, NULL, ackermann_thr, ¶ms))
{
perror("Could not create a thread\n");
exit(1);
}
if (pthread_join(mythread, NULL)) {
perror("join failed\n");
exit(1);
}
printf("result=%d\n", params.result);
return 0;
}
我在将返回的整数值转换为 void 指针时遇到问题。已从该站点尝试了一些选项,但我的问题似乎仍未解决。尽管程序编译时没有代码错误,但我遇到了分段错误。我是不是瞎了,我的代码有没有错误?
#include<pthread.h>
#include<stdio.h>
#include<stdint.h>
int ackermann(int a, int b)
{
if(a==0)
return a+1;
else if(a>0 && b==0)
{
return ackermann(a-1, 1);
}
else if(a>0 && b>0)
{
return ackermann(a-1,ackermann(a,(b-1)));
}
}
int main(int argc, char* argv[])
{
int a = atoi(argv[1]);
int b = atoi(argv[2]);
int c = ackermann(a,b);
void *ptr = &c;
pthread_t mythread;
if(pthread_create(&mythread, NULL, ptr, NULL))
{
printf("Could not create a thread\n");
}
pthread_exit(NULL);
return 0;
}
如评论中所述,您实际上并未在单独的线程中调用函数 ackermann
。您正在做的是直接从 main
调用该函数,将结果存储在 int
中,并将指向该 int
的指针作为第三个参数传递给 pthread_create
,这应该是指向 运行.
现在,ackermann
没有合适的签名可以传递给 pthread_create
。启动新线程的函数应该这样声明:
void *my_thread_function(void *parameter);
鉴于 ackermann
被递归调用,将包装函数传递给 pthread_create
并让该包装函数调用 ackermann
而不是将 ackermann
修改为匹配上面的签名。
因为您需要将多个参数传递给您的线程函数,所以您需要创建一个包含所有参数的 struct
并将指向该 struct
的指针传递给线程函数。
您还可以将 return 值存储在此结构中,以便启动线程的函数可以访问它。
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
int ackermann(int a, int b)
{
if(a==0) {
return a+1;
} else if(a>0 && b==0) {
return ackermann(a-1, 1);
} else if(a>0 && b>0) {
return ackermann(a-1,ackermann(a,(b-1)));
}
// if none of the above conditions are true, no value is returned
// better check for this
}
struct ackermann_params {
int a;
int b;
int result;
};
void *ackermann_thr(void *arg)
{
struct ackermann_params *params = arg;
params->result = ackermann(params->a, params->b);
return NULL;
}
int main(int argc, char* argv[])
{
struct ackermann_params params;
if (argc < 3) {
printf("invalid number of arguments\n");
exit(1);
}
params.a = atoi(argv[1]);
params.b = atoi(argv[2]);
pthread_t mythread;
if(pthread_create(&mythread, NULL, ackermann_thr, ¶ms))
{
perror("Could not create a thread\n");
exit(1);
}
if (pthread_join(mythread, NULL)) {
perror("join failed\n");
exit(1);
}
printf("result=%d\n", params.result);
return 0;
}