1つは、スレッドの属性です。
含まれるもの:分離状態、スケジューリングポリシーとパラメーター、スコープ、スタックサイズ、スタックアドレス、優先度など。
Linuxがスレッド属性用に定義したデータ型pthread_attr_t:
union pthread_attr_t
{
char __size[__SIZEOF_PTHREAD_ATTR_T];
long int __align;
};
2つ目は、スレッド属性データ型の操作関数です。
1.スレッドのデフォルト属性
int pthread_create(pthread_t * thread、const pthread_attr_t * attr、void *(* start_routine)(void *)、void * arg);
pthread_create()を呼び出して2番目のパラメーターにNULLを渡すと、スレッドはデフォルトのプロパティ(分離されていない、1MBスタック、および親プロセスと同じ優先順位)を持ちます。
2.スレッド属性オブジェクトの値を取得します
#define _GNU_SOURCE // 必须要定义的宏
#include <pthread.h>
int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr);
3.スレッドを作成するときにスレッドの属性を設定します
int pthread_attr_init(pthread_attr_t *attr);
役割:デフォルト値を使用して、pthread_attr_t構造体のnull以外のポインターを初期化します。
4.スレッド属性オブジェクトを破棄します
int pthread_attr_destroy(pthread_attr_t *attr);
役割:pthread_attr_t構造体のnull以外のポインターオブジェクトを破棄します
3、スレッド属性設定
1.切り離された状態
2つのタイプ:PTHREAD_CREATE_JOINABLEとPTHREAD_CREATE_DETACHED
効果:
- PTHREAD_CREATE_JOINABLE:このスレッドを同じプロセス内の他のスレッドが使用してpthread_join()を使用して同期を待機できることを示します。スレッドが占有していたリソースは、pthread_join();内の他のスレッドによって使用されていない場合、解放されます。同じプロセスphread_join()は、システムリソースのリークを引き起こします。
- PTHREAD_CREATE_DETACHED:このスレッドは、同じプロセス内の他のスレッドがphread_join()を使用してプロセスが戻るのを待つことを許可しないことを示します。他のプロセスがこのスレッドにpthread_join()を使用する場合、pthread_join()はすぐに戻り、エラーが発生します。コードは、phread_join()returnの戻り値によって返されます。
操作機能:
// 设置线程的分离状态属性
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
// 获取分离状态属性
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
// 把一个可连接线程转变成一个可分离线程
int pthread_detach(pthread_t thread);
栗:スレッドの切り離された状態属性を設定します
#include <pthread.h>
#include <stdlib.h>
#include <iostream>
#include <unistd.h>
using namespace std;
void* func(void* arg)
{
cout << "children thread is running\n";
return nullptr;
}
int main(int argc, char const *argv[])
{
pthread_attr_t thread_attr;
int rc = pthread_attr_init(&thread_attr);
if (rc)
{
cout << "pthread_attr_init failed: " << rc << endl;
return EXIT_FAILURE;
}
rc = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
if (rc)
{
cout << "pthread_attr_setdetachstate failed: " << rc << endl;
return EXIT_FAILURE;
}
pthread_t tid;
rc = pthread_create(&tid, &thread_attr, func, nullptr);
if (rc)
{
cout << "pthread_create failed: " << rc << endl;
return EXIT_FAILURE;
}
cout << "main thread will exit!\n" << endl;
sleep(1);
return EXIT_SUCCESS;
}
結果:
[xy@xunye thread]$ g++ -std=c++11 detach_state.cpp -o detach_state -lpthread
[xy@xunye thread]$ ./detach_state
main thread will exit!
children thread is running
栗:スレッドの切り離された状態属性を取得します
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <pthread.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
void handling_err(int err, const char* msg)
{
errno = err;
cerr << msg << endl;
exit(EXIT_FAILURE);
}
void* thread_start(void* arg)
{
pthread_attr_t attr;
int rc = pthread_getattr_np(pthread_self(), &attr); // 获取线程属性
if (rc)
handling_err(rc, "pthread_getattr_np failed.");
cout << "Thread's detachstate attributes: " << endl;
int detach_state = 0;
rc = pthread_attr_getdetachstate(&attr, &detach_state); // 获取线程分离属性
if (rc)
handling_err(rc, "pthread_attr_getdetachstate failed.");
cout << "Detach state: "
<< ((detach_state == PTHREAD_CREATE_DETACHED) ? "PTHREAD_CREATE_DETACHED" :
(detach_state == PTHREAD_CREATE_JOINABLE) ? "PTHREAD_CREATE_JOINABLE" : "???") << endl;
pthread_attr_destroy(&attr); // 销毁线程属性对象
}
int main(int argc, char const *argv[])
{
pthread_t tid;
int rc = pthread_create(&tid, nullptr, thread_start, nullptr);
if (rc)
handling_err(rc, "pthread_create failed.");
pthread_join(tid, nullptr); // 等待子线程结束
return 0;
}
結果:
[xy@xunye thread]$ g++ -std=c++11 get_detach_state.cpp -o get_detach_state -lpthread
[xy@xunye thread]$ ./get_detach_state
Thread's detachstate attributes:
Detach state: PTHREAD_CREATE_JOINABLE
2.スタックサイズ属性
スレッド関数で使用されるローカル変数は、スタックのサイズを超えてはなりません。
操作機能:
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
注:attrはスレッド属性変数です。stacksizeは設定されたスタックサイズです(単位:バイト)。成功した場合の戻り値は0です。それ以外の場合は、エラーコードが返されます。
3.スケジューリング戦略属性
3種類のスケジューリング:
1. SCHED_OTHERタイムシェアリングスケジューリング戦略(ラウンドロビンスケジューリング戦略)-システムのデフォルト
2. SCHED_FIFOリアルタイムスケジューリング戦略、先着順。CPUが占有されると、常に実行されます。優先度の高いタスクが到着するか、それ自体で諦めるまで実行を続けます
3. SCHED_RRリアルタイムスケジューリング戦略、タイムスライスローテーション。プロセスのタイムスライスが使い果たされると、システムはタイムスライスを再割り当てし、準備完了キューの最後に配置します。キューの最後に配置すると、同じ優先度を持つすべてのRRタスクの公平なスケジューリングが保証されます
操作機能:
// 获得线程可以设置的最高和最低优先级
int sched_get_priority_max(int policy);
int sched_get_priority_min(int policy);
// 设置和获取优先级
int pthread_attr_setschedparam(pthread_attr_t *attr, struct sched_param *param);
int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);
// 改变线程的调度策略
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
データ構造sched_param
struct sched_param
{
int __sched_priority; // 所要设定的线程优先级
};