2011-08-09 38 views
14

我正在为获取任务的分派队列创建一个c文件,并将其放入链接列表的队列中。为了做到这一点,我需要使用C,如何使用pthread_create函数创建线程

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

不过,我需要做出进入“工作”和创建函数的参数“PARAM”变量另一个函数来创建线程。我的朋友告诉我,我只需要在工作函数中的任何代码循环无限,所以线程不会死..任何人都可以解释每个参数进入pthread_create功能 - 尤其是workparam?我搜索谷歌这一点,但大多数的教程是很难理解的概念...

+0

http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_create.html – miku

+0

是的,我读到了。我只是想让别人用句子来解释我 - 每个参数的用途是什么 – Leanne

回答

23

的四个参数pthread_create依次为:

  1. 一个指向pthread_t结构,pthread_create将填写它创建的线程的信息。

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

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

  4. 您要启动线程的void *。如果您不需要,请通过NULL

16

澄清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); 

那么你的功函数可以转换指针类型,抢帕拉姆数据:

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

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

+6

请不要从'malloc'转换返回值。它的返回是'void *',并且总是可以分配给任何数据指针。 'parm'也一样。 –

+0

@Jens来自C++的坏习惯:/ –

相关问题