Linuxのusleepがスレッドをフリーズさせている場合の解決方法は何ですか?
usleep関数を使用するとスレッドがブロックされてしまう可能性があり、それによってスレッドが停止してしまうことがあります。スレッドを一時停止させるために他の方法を考えることで、スレッドがブロックされてしまう問題を避けることができます。
pthread_cond_timedwait関数を使用することができる代替方法があります。この関数は、指定された時間内に条件変数が発生するのを待つことができます。pthread_mutexと組み合わせて使用することで、スレッドの待機と起動を同期させることができます。
以下はサンプルコードです:
#include <stdio.h>
#include <pthread.h>
#include <time.h>
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* thread_func(void* arg) {
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 1; // 等待1秒钟
pthread_mutex_lock(&mutex);
pthread_cond_timedwait(&cond, &mutex, &ts);
pthread_mutex_unlock(&mutex);
printf("Thread woke up\n");
return NULL;
}
int main() {
pthread_t tid;
pthread_create(&tid, NULL, thread_func, NULL);
pthread_join(tid, NULL);
return 0;
}
上記の例では、スレッドは1秒待機した後に起こされます。1秒以内に他のスレッドがpthread_cond_signalまたはpthread_cond_broadcast関数を呼び出してこのスレッドを起こさない場合、スレッドは自動的に起きます。
usleep関数を使用することによるスレッドの停止を回避するためにこれを行うことができます。