C,如何使用pthread_create函数创建线程

Lea*_*nne 18 c multithreading pthreads function createthread

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

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

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

dus*_*uff 34

这四个参数pthread_create依次为:

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

  2. 指向pthread_attr_t带有线程参数的指针.你可以安全地通过NULL大部分时间.

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

  4. void *要启动与线程.通过NULL如果你不需要它.


Foo*_*Bah 21

澄清duskwuff的答案:

work参数是一个函数指针.该函数应该使用一个参数,该参数表示为类型void *和返回值void *.

param应该是指向work将接收的数据的指针.

举个例子,假设您想将两个int传递给worker.然后,你可以创建这样的东西:

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

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

void *work(void * parm) {
    int *param = (int *)parm;
    int first_val = param[0];
    ....
}
Run Code Online (Sandbox Code Playgroud)

您可以执行更复杂的操作,例如创建包含您需要传递的所有数据的结构.

  • 请不要从`malloc`转换返回值.它的返回是`void*`,并且总是可以分配给任何数据指针.同样适用于'parm`. (6认同)
  • @Jens 如果您使用的是 C++,那么您**必须**显式地从 `malloc` 中转换返回值,否则代码将无法编译。如果您使用 C,那么它是可选的。 (3认同)