C中带有pthread和并发的Segfault

时间:2018-09-15 17:57:47

标签: c

我正在尝试创建一个线程,该线程一直等到分配任务后再执行,但是我遇到了麻烦。

#include "dispatchQueue.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

pthread_mutex_t mutex;
pthread_cond_t cond;
task_t *task;

void test1() {
    sleep(1);
    printf("test1 running\n");
}

void* do_stuff(void *args) {
    printf("in do stuff\n");
    pthread_mutex_lock(&mutex);
    printf("after do stuff has lock\n");
    task_t *task = (task_t *)args;
    (task->work) (task->params);
    pthread_mutex_unlock(&mutex);

}

int main(int argc, char** argv) {
    pthread_t thread;
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);
    pthread_mutex_lock(&mutex);
    printf("after main gets lock\n");
    pthread_create(&thread, NULL, do_stuff, task);
    task = task_create(test1, NULL, "test1");
    pthread_mutex_unlock(&mutex);   
    printf("after main unlocks \n");

    pthread_join(thread, NULL);
}

上面的代码将产生段错误,但是,如果我切换行pthread_create和task = task_create(),则可以正常工作。我一点都不熟悉C,所以我想知道为什么会这样?

如果有帮助的话,这就是创建任务的方式,在这一点上,我很确定这是我使用pthreads方式的问题。

task_t *task_create(void (*work)(void *), void *param, char* name) {
    task_t *task_ptr = malloc(sizeof(task_t));
    if (task_ptr == NULL) {
        fprintf(stderr, "Out of memory creating a new task!\n");
        return NULL;
    }   
    task_ptr->work = work;
    task_ptr->params = param;
    strcpy(task_ptr->name, name);
    return task_ptr;
}

1 个答案:

答案 0 :(得分:1)

pthread_create(&thread, NULL, do_stuff, task);
task = task_create(test1, NULL, "test1");

您正在将垃圾传递给线程。您尚未在此处将task设置为任何特定值,但是您已将其作为参数传递给了线程。

void* do_stuff(void *args) {         // *** args is garbage here
    printf("in do stuff\n");
    pthread_mutex_lock(&mutex);
    printf("after do stuff has lock\n");
    task_t *task = (task_t *)args;   // ** So task is garbage here
    (task->work) (task->params);
    pthread_mutex_unlock(&mutex);
}

在这里,您从task初始化args。但是args有一个垃圾值。

如果您有某种类型的集合要跟踪线程将要执行的任务,则必须向线程传递一个参数,使它可以可靠地找到该集合。在这种情况下,&task可以工作。