静态与动态 pthread 创建

Static vs Dynamic pthread creation

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

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

例如

一个。初始化 5 个线程

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 
}

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

pthread_create(&t[connections_made+1],&routine,NULL)

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

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

为什么这是正确的?

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

无论如何,pthread_create() 会按照文档中的说明进行操作。与任何其他函数一样,除了传递给它的参数外,它对调用它的上下文一无所知。它可能会失败,但这不受调用者循环的影响,至少不会直接受到影响。当pthread_create()成功时,它创建并启动一个新线程,该线程一直运行到顶层调用其线程函数returns,pthread_exit()被线程调用,线程被取消,或者进程终止。

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