次のプログラムを実行しています。すぐに死ぬスレッドを作成するだけです。
私が見つけたのは、93 から 98 (わずかに異なります) の呼び出しが成功した後、次の pthread_create() へのすべての呼び出しがエラー 11 で失敗することです: リソースが一時的に利用できません。スレッドを正しく閉じていると思うので、スレッドが持っているリソースを放棄する必要がありますが、一部のリソースが利用できなくなります。
プログラムの最初のパラメーターを使用すると、pthread_create() の呼び出し間の間隔を設定できますが、さまざまな値でテストしたところ、間隔は重要ではないことがわかりました (まあ、以前にエラーが発生します): 成功した回数通話は同じになります。
プログラムの 2 番目のパラメーターを使用すると、呼び出しが失敗した後にスリープ間隔を設定できますが、間隔の長さには違いがないようです。
ここで私はどの天井にぶつかっていますか?
編集: doSomething() でエラーが見つかりました: ロックをロック解除に変更すると、プログラムは正常に実行されます。疑問が残ります: エラーが修正されずに使い果たされているのはどのリソースですか?
#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]));
}
}