静态与动态 pthread 创建

时间:2021-03-17 03:25:22

标签: c pthreads semaphore

我有一个关于创建线程的问题。

特别是我想知道循环线程之间的区别[i] 不是循环而是回忆 pthread_create

例如

A.初始化 5 个线程

GET http://localhost:3000/Heading.png 404 (Not Found) 

B.连接到服务器的传入客户端

for(i=0,i<5;i++){
pthread_create(&t[i],NULL,&routine,NULL);
}

为传入的客户端创建线程以跟踪已经建立的连接是否是正确的方法,也许是这样的?

while(true){

client_connects_to_server = accept(sock, (struct sockaddr *)&server,  
                   (socklen_t*)&server_len)

pthread_create(&t,NULL,&routine,NULL); //no iteration 
}

我担心的是,如果选项 B 终止线程或“重写”客户端连接,则无法处理并发 pthread。

这是一个没有进行迭代的例子 https://gist.github.com/oleksiiBobko/43d33b3c25c03bcc9b2b

为什么这是正确的?

1 个答案:

答案 0 :(得分:0)

与您明显的断言相反,您的两个示例都在循环内调用 pthread_create()。在示例 A 中,它是一个 for 循环,将迭代已知次数,而在示例 B 中,它是一个 while 循环,将迭代无限次。我猜已知数 vs 无界数就是您所说的“静态”和“动态”,但这不是这些术语的常规用法。

在任何情况下,pthread_create() 都会做它记录在做的事情。与任何其他函数一样,除了传递给它的参数之外,它对调用它的上下文一无所知。它可能会失败,但这不会受到调用者循环的影响,至少不会直接受到影响。当 pthread_create() 成功时,它会创建并启动一个新线程,该线程一直运行直到对其线程函数的顶层调用返回、pthread_exit() 被线程调用、线程被取消或进程终止。

您的两个示例之间的主要显着区别在于,A 通过将所有线程 ID 记录在数组的不同元素中来保留所有线程 ID,而 B 每次创建新线程时都会覆盖先前的线程 ID。但是线程 ID 不是线程本身。如果您丢失了一个线程的 ID,那么您就不能再加入它,除此之外,这不会影响线程的操作,包括它与内存、文件或同步对象(如信号量)的交互。在这方面,示例 B 更适合用于分离调用它的线程的线程函数,因此连接问题没有实际意义。示例 A 小心地保留所有线程 ID 对于自行分离的线程毫无意义,但如果线程需要稍后加入,则是必要的。