23

我正在为获取任务的调度队列制作 ac 文件,并将其放入作为链表的队列中。为了做到这一点,我需要使用创建线程

pthread_t cThread;
if(pthread_create(&cThread, NULL, work, param)){
    perror("ERROR creating thread.");
}

但是,我需要创建另一个函数,该函数将进入“工作”和“参数”变量作为创建函数的参数。我的朋友告诉我,我只需要将任何代码放入无限循环的工作函数中,这样线程就不会死掉。任何人都可以解释每个参数进入pthread_create函数 - 特别是对于workand param?我在谷歌上搜索过这个,但大多数教程都很难理解这个概念......

4

2 回答 2

43

四个参数pthread_create依次为:

  1. 指向pthread_t结构的指针,该结构pthread_create将填充有关它创建的线程的信息。

  2. 指向pthread_attr_t带参数的线程的指针。NULL大多数时候你可以安全地过去。

  3. 在线程中运行的函数。该函数必须返回void *并接受一个void *参数,您可以使用任何您认为合适的参数。(例如,如果您使用相同的函数启动多个线程,则可以使用此参数来区分它们。)

  4. void *您要启动线程的那个。NULL不需要就通过。

于 2011-08-09T03:02:29.930 回答
24

澄清黄昏的回答:

work参数是一个函数指针。该函数应采用一个参数,该参数表示为 typevoid *和 return value void *

param预计是一个指向work将要接收的数据的指针。

例如,假设您想将两个 int 传递给工作人员。然后,您可以创建如下内容:

int *param = (int *)malloc(2 * sizeof(int));
param[0] = 123;
param[1] = 456;
pthread_create(&cThread, NULL, work, param);

然后你的工作函数可以转换指针类型并获取参数数据:

void *work(void * parm) {
    int *param = (int *)parm;
    int first_val = param[0];
    ....
}

你可以做更复杂的事情,比如用你需要传递的所有数据创建一个结构。

于 2011-08-09T03:10:08.320 回答