【发布时间】:2026-01-16 11:45:02
【问题描述】:
考虑以下程序,
static long count = 0;
void thread()
{
printf("%d\n",++count);
}
int main()
{
pthread_t t;
sigset_t set;
int i,limit = 30000;
struct rlimit rlim;
getrlimit(RLIMIT_NPROC, &rlim);
rlim.rlim_cur = rlim.rlim_max;
setrlimit(RLIMIT_NPROC, &rlim);
for(i=0; i<limit; i++) {
if(pthread_create(&t,NULL,(void *(*)(void*))thread, NULL) != 0) {
printf("thread creation failed\n");
return -1;
}
}
sigemptyset(&set);
sigsuspend(&set);
return 0;
}
这个程序预计会打印 1 到 30000。但它有时会打印 29945、29999、29959 等。为什么会这样?
【问题讨论】:
-
为什么会这样打印?
-
为什么你的线程函数没有使用正确的签名?
-
count的无保护使用是一种竞争条件;考虑使用 C11 原子类型。 -
为什么不打印 29945、29999 或 29959?这些都在 1 到 30000 之间。
标签: c linux multithreading pthreads