从pthread内部调用函数?

时间:2017-10-21 20:32:10

标签: c multithreading pthreads

如果我有一个线程函数,并且从里面调用另一个函数(位于一个单独的.c文件中),那么线程函数的每个实例都会获得它自己的被调用函数版本吗?例如:

档案1

void* threaded_func(void* data) {
  function2(...);
}

file 2

int a;

int function2(...) {
  int b;
}

在我的例子中,对于所有线程,int是一个相同的int吗?我在function2中定义的变量怎么样(即int b)?

某些背景信息:

我正在创建一个简单的HTTP服务器,而我的function2是一个serve_client函数,只应在连接关闭时返回。我遇到了一个问题,我认为是由于每个新线程都覆盖了file2(int a)中的一些变量。我认为我的问题是我希望C源文件的行为与Java中的类一样。

2 个答案:

答案 0 :(得分:2)

  

线程函数的每个实例都获得它自己的被调用函数版本吗?

松散地说,这是正确的,前提是函数不使用任何全局变量(例如,示例中为int a;)或任何具有静态存储持续时间的变量。如果a被多个线程“共享”,则可能是您问题的根源。

如果需要在线程之间共享a,则需要同步其访问权限。如果a需要对每个线程都是唯一的,则需要线程本地存储。例如,使用C11的__Thread_local或gcc的__thread

答案 1 :(得分:1)

C函数只是机器代码,可以由多个线程(或进程)运行。重要的是该函数使用的数据。 C没有closures(您可以使用callbacks模拟它们,这是使用其他客户端数据的某种功能)。由于answered by usr还会在thread local storage duration上阅读thread_local。每个thread都有自己的call stack

您应首先阅读一些POSIX thread tutorial

您需要关注synchronization(和semaphores),特别是使用mutexes(并锁定serialize对全局共享变量的访问权限)。另请阅读ACID次交易。有时您可以使用atomic类型和atomic operations

顺便说一句,您可能想要使用某些HTTP服务器库,如libonion

您应该查看现有free software项目的源代码(例如github)。

在Linux上,另请阅读pthreads(7)nptl(7)futex(7)以及sem_overview(7)clone(2)