我一直在使用该pthread库来创建和连接C中的线程.
我应该何时从一开始就创建一个脱离的线程?与可连接线程相比,它是否提供任何性能优势?
pthread_join()在连接(默认情况下)线程上不执行操作是否合法?或者这样的线程是否应该始终使用该detach()功能pthread_exit()?
Jon*_*ler 73
当您知道不想等待它时,创建一个分离的线程pthread_join().唯一的性能优势是,当分离的线程终止时,可以立即释放其资源,而不必在释放资源之前等待线程加入.
加入可连接线程是"合法的"; 但是通常不建议这样做,因为(如前所述)在连接线程之前不会释放资源,所以如果你不加入它们,它们将无限期地保持捆绑(直到程序退出).
我什么时候应该从一开始就创建一个分离的线程?
每当应用程序不关心该线程何时完成并且也不关心线程的返回值时(线程可以通过将值传递回其他线程/应用程序pthread_exit)。
例如,在客户端-服务器应用程序模型中,服务器可以创建一个新线程来处理每个请求。但服务器本身并不关心线程的返回值。在这种情况下,创建分离线程是有意义的。
服务器唯一需要确保的是当前处理的请求已完成。它可以做到这一点,只需退出主线程而不退出整个程序/应用程序。当进程中的最后一个线程退出时,应用程序/程序就会自然退出。
伪代码可能如下所示:
/* A server application */
void process(void *arg)
{
/* Detach self. */
pthread_detach(pthread_self());
/* process a client request. */
pthread_exit(NULL);
}
int main(void)
{
while (not_done) {
pthread_t t_id;
errno = pthread_create(&t_id, NULL, process, NULL);
if (errno) perror("pthread_create:");
}
/* There may be pending requests at this point. */
/* Just exit the main thread - not the whole program - so that remaining
requests that may still be processed can continue. */
pthread_exit(NULL);
}
Run Code Online (Sandbox Code Playgroud)
另一个示例可能是守护程序或记录器线程,只要应用程序运行,它就会定期记录一些信息。
与可连接线程相比,它是否具有任何性能优势?
在性能方面,可连接线程与分离线程之间没有区别。唯一的区别是,对于分离线程,其资源(例如线程堆栈和任何关联的堆内存等 - 构成这些“资源”的具体内容是特定于实现的)。
在可连接(默认)线程上不执行 pthread_join() 是否合法?
是的,不加入线程是合法的。pthread_join只是一个方便的功能,除非您需要,否则根本不需要使用。但请注意,创建的线程默认是可连接线程。
您可能想要加入的一个示例是当线程执行在它们之间分配的“部分”工作时。在这种情况下,您需要在继续之前检查所有线程是否完成。任务场并行性就是一个很好的例子。
或者这样的线程应该在 pthread_exit() 之前始终使用 detach() 函数吗?
不必要。但您经常需要在创建时决定是否需要可连接线程或分离线程。
请注意,虽然可以通过调用 设置属性来创建可分离线程PTHREAD_CREATE_DETACHED,但pthread_attr_setdetachstate线程决定可以决定在任何时间点分离自身,例如使用pthread_detach(pthread_self())。此外,具有另一个线程的线程 id () 的线程pthread_t可以使用 分离pthread_detach(thread_id);。
| 归档时间: |
|
| 查看次数: |
31593 次 |
| 最近记录: |