使用pthread_create

时间:2012-11-23 21:38:51

标签: c pthreads

我尝试使用pthread_create时遇到错误。我理解我使用 argsRight-> thread_id / argsLeft-> thread_id NULL 是不正确的,但我不确定如何引用该线程ID。它需要一个指针,但似乎我尝试的每一种方式(&,*),GCC编译器都不会接受。

另外,有什么理由不接受我使用NULL吗?我看不出任何错误的原因,但是GCC说我对void函数的使用是无效的。

有人能说明如何正确设置对pthread_create的调用吗?我已经在我使用pthread_create函数的方法中包含了部分。

void pthreads_ms(struct ms_args* args)
{
int left_end = (args->end + args->start) / 2;
int right_start = left_end + 1;
int rc1, rc2;

// Create left side struct
struct ms_args* argsLeft;
argsLeft = malloc(sizeof(args));
argsLeft->thread_id = (2 * args->thread_id + 1);
argsLeft->start = args->start;
argsLeft->end = left_end;
argsLeft->array = args->array;

// Same methodology as above to create the right side

if (args->start != args->end)
{
        // Print the thread id number, and start and end places
            printf("[%d] start %d end %d", args->thread_id, args->start, args->end);

        // Sort Left Side
        rc1 = pthread_create(argsLeft->thread_id, NULL, pthreads_ms(argsLeft), argsLeft);   //problem line here

        //Sort right side
        rc2 = pthread_create(argsRight->thread_id, NULL, pthreads_ms(argsRight), argsRight); //problem line here
}

2 个答案:

答案 0 :(得分:1)

这不是您的应用程序, pthread_create()将填充 thread_id 字段。所以,首先, struct ms_args 的字段应该是 pthread_t 类型,你应该传递一个指向该字段的指针:

pthread_create(&argsLeft->thread_id, ...

答案 1 :(得分:1)

根据pthread_create,正确的电话应该是

rc1 = pthread_create(&(argsLeft->thread_id), NULL, &pthreads_ms, argsLeft);

右侧同样如此。

pthread_ms()的定义应包含返回值

void *pthreads_ms(struct ms_args* args) { ... }

除此之外,您的代码对我来说非常危险,因为它为每个现有代码创建了递归两个线程。根据您的输入,这可能会构建一个大的线程树,这可能会使您的系统停止运行。