线程入口函数和普通函数有什么区别?

时间:2011-09-13 08:51:29

标签: c linux multithreading

我想知道线程入口函数之间的区别:

void* thread_function (void* parameter)
{
   struct parameter * thread_data = (struct parameter *)parameter;
   char buffer[20];
   int temp;
   printf_buffer(buffer);
}

和正常功能:

void printf_buffer(char *buffer)
{
    printf("buffer is %s",buffer);
    return;
}

我知道在创建线程时调用线程条目,以及如何使用普通函数。

在执行,行为或创建实例方面,线程入口函数和普通函数之间是否存在其他差异?

3 个答案:

答案 0 :(得分:4)

你所谓的“线程函数”之间的语言没有区别(尽管Justin编辑了它称之为“线程入口函数”)和你称之为“正常函数”的语言。

使用pthreads,线程的所谓“启动例程”是一个函数,它接受一个void*参数并返回void*,但没有什么可以阻止你正常调用相同的函数”

当线程的启动例程返回时,线程完成执行,但这只是因为线程实现调用它,然后完成线程。这并不是因为启动例程本身有什么特别之处。

答案 1 :(得分:1)

线程函数只是线程的入口/出口点。该函数的执行与您所称的普通函数没有什么不同。

答案 2 :(得分:1)

man pthread_create很好地定义了它:

http://linux.die.net/man/3/pthread_create

尚未提及的一个主要区别是线程条目应该期望在除调用者之外的堆栈上操作。因此,当您的线程被分离时,您经常希望将资源的堆副本作为参数传递,然后在条目中释放它:

// the caller must pass a heap copy of struct parameter* arg
void* detached_entry(void* arg) {

  struct parameter* parameter = (struct parameter*)arg;
  ...
  free(parameter);
}