在循环中创建线程
Creating threads in a loop
像那样在循环中创建线程不好吗?
线程函数示例:
void *thread_func(void* args)
{
const char *str = (const char *)args;
printf("Threading %s\n", str);
usleep(1000);
}
主循环:
pthread_t thread;
while (1) {
char *str = "test str";
if (pthread_create(&thread, NULL, thread_func, str)) {
fprintf(stderr, "Failed to create thread\n");
return -1;
}
usleep(3000);
/* Thread guaranteed finished here */
}
或者我必须创建一次并在循环中重复使用
创建一个线程并重复使用它绝对是一个更好的主意,因为线程创建本身会消耗 CPU 资源。使用这段代码,线程创建将在一段时间后开始失败。原因是,如果我们不加入一个可加入的线程,它最终会成为消耗一些系统资源的僵尸线程。所以我们可以说,对于这段代码,我们在每次迭代中都在泄漏一些系统资源,最终系统将达到一种状态,即它没有足够的资源来创建线程。通过在 "usleep(3000)" 语句之前添加对 pthread_join 的调用可以避免此问题。
您的代码不正确。虽然可以重复使用 pthread_t
变量,但您应该 join 每个线程。否则,您的系统可能 运行 很快就会耗尽资源。
线程在休眠任何时间后“保证已完成”的假设也不正确。 (此外,如果你打算在主线程上休眠直到工作线程完成,你为什么首先创建一个单独的线程?)
因此,让 n 线程正常工作的一般方法是创建 array of n 线程句柄,为每个线程启动一个线程,然后同时执行主线程应该做的任何事情,最后加入所有线程。
#include <stdio.h>
#include <pthread.h>
#define NTHREADS 10
void * thread_func(void * args);
int
main()
{
pthread_t threads[NTHREADS];
void * retvals[NTHREADS];
int count;
for (count = 0; count < NTHREADS; ++count)
{
if (pthread_create(&threads[count], NULL, thread_func, "...") != 0)
{
fprintf(stderr, "error: Cannot create thread # %d\n", count);
break;
}
}
for (int i = 0; i < count; ++i)
{
if (pthread_join(threads[i], &retvals[i]) != 0)
{
fprintf(stderr, "error: Cannot join thread # %d\n", i);
}
}
}
像那样在循环中创建线程不好吗?
线程函数示例:
void *thread_func(void* args)
{
const char *str = (const char *)args;
printf("Threading %s\n", str);
usleep(1000);
}
主循环:
pthread_t thread;
while (1) {
char *str = "test str";
if (pthread_create(&thread, NULL, thread_func, str)) {
fprintf(stderr, "Failed to create thread\n");
return -1;
}
usleep(3000);
/* Thread guaranteed finished here */
}
或者我必须创建一次并在循环中重复使用
创建一个线程并重复使用它绝对是一个更好的主意,因为线程创建本身会消耗 CPU 资源。使用这段代码,线程创建将在一段时间后开始失败。原因是,如果我们不加入一个可加入的线程,它最终会成为消耗一些系统资源的僵尸线程。所以我们可以说,对于这段代码,我们在每次迭代中都在泄漏一些系统资源,最终系统将达到一种状态,即它没有足够的资源来创建线程。通过在 "usleep(3000)" 语句之前添加对 pthread_join 的调用可以避免此问题。
您的代码不正确。虽然可以重复使用 pthread_t
变量,但您应该 join 每个线程。否则,您的系统可能 运行 很快就会耗尽资源。
线程在休眠任何时间后“保证已完成”的假设也不正确。 (此外,如果你打算在主线程上休眠直到工作线程完成,你为什么首先创建一个单独的线程?)
因此,让 n 线程正常工作的一般方法是创建 array of n 线程句柄,为每个线程启动一个线程,然后同时执行主线程应该做的任何事情,最后加入所有线程。
#include <stdio.h>
#include <pthread.h>
#define NTHREADS 10
void * thread_func(void * args);
int
main()
{
pthread_t threads[NTHREADS];
void * retvals[NTHREADS];
int count;
for (count = 0; count < NTHREADS; ++count)
{
if (pthread_create(&threads[count], NULL, thread_func, "...") != 0)
{
fprintf(stderr, "error: Cannot create thread # %d\n", count);
break;
}
}
for (int i = 0; i < count; ++i)
{
if (pthread_join(threads[i], &retvals[i]) != 0)
{
fprintf(stderr, "error: Cannot join thread # %d\n", i);
}
}
}