Linuxでpthread_detach関数をどのように使うか
pthread_detach 関数は、pthread_join による回収処理が不要になり、自動的にリソースが解放されるようにスレッドを切り離します。
pthread_detach関数は以下の手順で使用します。
- スレッドを作成する際に、スレッド属性を「切り離し」状態にするには、pthread_attr_setdetachstate 関数を利用し、detachstate 引数を PTHREAD_CREATE_DETACHED に設定します。
サンプルコードを以下に示します。
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void *thread_function(void *arg)
{
// 线程的工作内容
sleep(3);
printf("Thread function finished.\n");
return NULL;
}
int main()
{
pthread_t thread_id;
pthread_attr_t attr;
// 初始化线程属性
pthread_attr_init(&attr);
// 设置线程属性为分离状态
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
// 创建线程
pthread_create(&thread_id, &attr, thread_function, NULL);
// 销毁线程属性
pthread_attr_destroy(&attr);
// 主线程的工作内容
printf("Main thread finished.\n");
return 0;
}
まずスレッド属性 attr を初期化し、pthread_attr_setdetachstate 関数を使ってスレッド属性をデタッチ状態に設定します。次に pthread_create 関数を使用して新しいスレッドを作成し、スレッド属性 attr を pthread_create の引数として渡します。最後に pthread_attr_destroy 関数を使用してスレッド属性を破棄します。
- スレッド内で pthread_detach() 関数を使用してスレッドを切り離すという方法も考えられます.
サンプルコードを以下に示します。
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void *thread_function(void *arg)
{
// 线程的工作内容
sleep(3);
printf("Thread function finished.\n");
return NULL;
}
int main()
{
pthread_t thread_id;
// 创建线程
pthread_create(&thread_id, NULL, thread_function, NULL);
// 分离线程
pthread_detach(thread_id);
// 主线程的工作内容
printf("Main thread finished.\n");
return 0;
}
この例では、pthread_create関数を使用して新しいスレッドを作成し、そのスレッドIDをthread_id変数に格納しています。その後、pthread_detach関数を使用してそのスレッドを切り離しています。
いずれの方法でもスレッドがデタッチされると終了時に自動的にリソースを解放し、他のスレッドがpthread_join関数を呼び出し、スレッドの戻り値や状態を取得する必要はありません。