我正在尝试创建一个线程,该线程一直等到分配任务后再执行,但是我遇到了麻烦。
#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;
}
答案 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
可以工作。