我正在运行以下程序。它只是创建立即死亡的线程。
我发现,在 93 到 98 次(略有不同)成功调用之后,每次对 pthread_create() 的下一次调用都会失败,并出现错误 11:资源暂时不可用。我想我正确地关闭了线程,所以它应该放弃它拥有的任何资源,但一些资源变得不可用。
程序的第一个参数允许我设置调用 pthread_create() 之间的间隔,但使用不同的值进行测试,我了解到间隔无关紧要(好吧,我会更早得到错误):成功的次数调用将是相同的。
该程序的第二个参数允许我在呼叫失败后设置睡眠间隔,但间隔的长度似乎没有任何区别。
我在这里撞到哪个天花板?
编辑:在 doSomething(): change lock to unlock 中发现错误,程序运行正常。问题仍然存在:由于错误未纠正而耗尽了哪些资源?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <pthread.h>
#include <errno.h>
pthread_mutex_t doSomethingLock;
void milliSleep(unsigned int milliSeconds)
{
struct timespec ts;
ts.tv_sec = floorf(((float)milliSeconds / 1000));
ts.tv_nsec = ((((float)milliSeconds / 1000) - ts.tv_sec)) * 1000000000;
nanosleep(&ts, NULL);
}
void *doSomething(void *args)
{
pthread_detach(pthread_self());
pthread_mutex_lock(&doSomethingLock);
pthread_exit(NULL);
}
int main(int argc, char **argv)
{
pthread_t doSomethingThread;
pthread_mutexattr_t attr;
int threadsCreated = 0;
if (argc != 3)
{
fprintf(stderr, "usage: demo <interval between pthread_create() in ms> <time to wait after fail in ms>\n");
exit(1);
}
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&doSomethingLock, &attr);
while (1)
{
pthread_mutex_lock(&doSomethingLock);
if (pthread_create(&doSomethingThread, NULL, doSomething, NULL) != 0)
{
fprintf(stderr, "%d pthread_create(): error %d, %m\n", threadsCreated, errno);
milliSleep(atoi(argv[2]));
}
else threadsCreated++;
milliSleep(atoi(argv[1]));
}
}