静态与动态 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 的小心保存对于自行分离的线程毫无意义,但如果线程需要稍后加入则很有必要。
我有一个关于创建线程的问题。
具体来说我想知道线程循环之间的区别[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 的小心保存对于自行分离的线程毫无意义,但如果线程需要稍后加入则很有必要。