スレッドベース--スレッド制御


3.スレッド制御
   1). 
スレッドのプロパティ
     
ターゲット:スレッドのdetached/join状態、スレッドスタックのサイズ、最下位アドレスなどのプロパティを設定できます.
     
detached/join状態の違い:
スレッドが分離状態(detached)にある場合、スレッドが終了するとosは直ちにリソースを回収する.プライマリスレッドはpthread_を呼び出すことはできませんjoinスレッド終了時の戻り値を取得します.
スレッドが未分離状態(join)の場合、スレッドが終了すると、メインスレッド
pthread_を呼び出すjoinはスレッド終了時の戻り値を取得し、スレッドリソースを解放する
.
        
a)データ型pthread_attr_t
b)属性構造pthread_の初期化及び解放attr_init  pthread_attr_destroy 
        
初期化時にメモリが割り当てられるので、必ず_..destroy関数対応
c)スレッド分離状態pthread_の取得または設定attr_setdetachstate      pthread_attr_getdetachstate
オプションのステータス値は2種類あります.
       PTHREAD_CREATE_DETACHED分離状態
       PTHREAD_CREATE_JOINABLE正常状態、pthread_を使用可能joinがステータスを取得する
d)pthread_を取得すべきatr_destroyの戻り値はpthread_を使用するためattr_Init初期化時にメモリが割り当てられている可能性がありますが、メモリの解放に失敗すると、
メモリ漏洩の原因となる
e)スレッドスタックの空間の大きさを制御する
需要:複数のスレッドのスタック領域が、プロセスの使用可能な仮想アドレス領域を超えて累計されます.
スレッド呼び出し関数の自動変数が多いか、再帰的に深い
1)stackaddrスレッド属性の管理、stacksizeスレッド属性の管理
       pthread_attr_getstack
       pthread_attr_setstack 
2)スレッドスタックのサイズの取得または設定
       pthread_attr_setstacksizeシステムはメモリの割り当てを支援し、自分で管理しない.
       pthread_attr_getstacksize
3)スレッドスタックの保護
デフォルトサイズはマクロPAGESIZEですが、スタック属性を変更するとこの値は0になります
       pthread_attr_getguardsize
       pthread_attr_setguardsize
f)スレッド属性-同時性
       pthread_attr_setconcurency
       pthread_attr_getconcurency
 
   2). 
同期プロパティ(スレッドの
同期オブジェクト(例:反発量、読み書きロック、条件変数)のプロパティ)
同期を実現する3つの方式におけるオブジェクトの属性
     a)
反発量属性pthread_mutexattr_t
1)pthread_の初期化と解放mutexattr_init pthread_mutexattr_destroy
2)プロセス共有属性
共有プロパティの取得と設定pthread_mutexattr_getpshared   pthread_mutexattr_setpshared
         PTHREAD_PROCESS_PRIVAEプロセス内の複数のスレッドは、同じ同期オブジェクト、デフォルト属性にアクセスできます.
         PTHREAD_PROCESS_SHAREDの複数のプロセスは、同じメモリ領域のメモリ共有技術を共有することができる.プロセス間の同じメモリ領域へのアクセスの同期に反発量を使用
          
3)反発量
タイプのプロパティ
ターゲット:同じスレッドでロックされた反発量を再ロックするかどうかなどのプロパティを設定します.
         PTHREAD_MUTEX_NORMAL標準の反発量タイプ、エラーチェックやデッドロックチェックをしない
         PTHREAD_MUTEX_DEFAULTは、オペレーティングシステムに依存して他のタイプのマッピングを提供します.
         PTHREAD_MUTEX_ERRORCHECKエラーチェックの提供
         PTHREAD_MUTEX_RECURSIVE (
再帰ロック)は複数回のロックを許可するが、対応する回数tmdをロック解除する必要がある.このタイプを再帰ロックと呼ぶ
反発量タイプのプロパティの取得と設定
         pthread_mutexattr_gettype  pthread_mutexattr_settype
    
 
適用シーン:
    
 
PTHREAD_MUTEX_RECURSIVE (
再帰ロック
)既存のシングルスレッドインタフェースをマルチスレッド環境に配置する場合は、再帰ロックを使用します.
    
例:
     
     
同じスレッドではfunc 1,func 2がそれぞれ反発量にロックされ,再帰ロックでなければデッドロックが発生する.
    
 
b)読み書きロック属性pthread_rwlockattr_t
サポートするかどうかを設定できます
プロセス共有属性(デフォルトではサポートのみ)
スレッド共有プロパティ)
c)条件変数属性pthread_condattr_t
        
サポートするかどうかを設定できます
プロセス
共有プロパティ(デフォルトではサポートのみ)
 
スレッド
共有プロパティ)
 
4.スレッド再読み込み
     
再入可能関数--信号処理関数で実行中のプログラムが信号処理プログラムによって中断された後、戻り時に正しく動作しない関数を指します.
理由:(a)静的データ構造を使用している--グローバルであり、他のスレッド/信号処理関数などで使用される
(b)malloc/free(mallocが割り当てたストレージ領域のリンクテーブルを維持し、信号処理関数を実行すると、プロセスが変更されている可能性があります.
このテーブルは、破損したリングをもたらします)
(c)標準I/O関数--大部分はグローバル構造変数を使用している
     1)
スレッドセキュリティ:1つの関数が同じ時刻に複数のスレッドによって安全に呼び出される場合
2)システムがスレッドセキュリティ関数sysconf(_POSIX_THREAD_SAFE_FUNCTIONS)をサポートするかどうか
     
非スレッドセキュリティの原因:返されたデータは静的メモリキャッシュ領域に格納され、複数のスレッドが関数を呼び出すと、前に使用している領域が上書きされます.
     
これを再入可能にし、自分のバッファを割り当て、他のスレッドに干渉されないようにし、スレッドの安全を保証することができます.
再入後の関数は,スレッドセキュリティとなり,信号処理プログラムに再入可能であることを意味しない.例を挙げてください.よくわかりません.
3)非同期信号セキュリティ:非同期信号処理プログラムに対する関数の再入力が安全である場合
4)ロックファイルの3つの関数
       flockfile  ftrylockfile   funlockfile
このロックは再帰ロックです
5)関数がプロセス内で一度だけ呼び出されていることを確認する
       pthread_once_t var = PTHREAD_ONCE_INIT;
       pthread_once(&var, function);
 
5.スレッドプライベートデータ
ストレージとクエリー
データ#データ#
スレッドに関連するメカニズム.他のスレッドと同期してアクセスする問題を回避
1)必要なデータ型:pthread_key_t
2)プライベートデータを作成するには
        pthread_key_t key;     
       a)pthread_key_create(&key,クリーンアップ関数アドレス)は一般的にpthread_を通過するonceは関数が1回のみ実行され、変数が1回のみ初期化されることを保証します.
       b)char* addr = pthread_getspecific(&key)
c)addrにメモリmallocを割り当てる
       d)pthread_setspecific(&key, addr);
       e)pthread_key_削除キー
f)スレッド終了、クリーンアップ関数アドレス実行
 
6.スレッドキャンセル
pthread_の設定cancle関数に関連する属性項目
1)スレッドをキャンセル可能に設定できる
       pthread_setcancelstate(int state, int* oldstate)
     2)pthread_cancelはただの申請で、スレッドがキャンセルポイントに達してからキャンセルされます.
3)遅延キャンセルpthread_testcancel、キャンセルポイントのない関数に適しています
4)キャンセルタイプpthread_の設定setcanceltype
 
7.スレッドとIO
     
pread,pwrite原子io操作
例:
スレッドA
    lseek( fd,  300, SEEK_SET);
    read( fd, buf1,  100);
    B
    lseek( fd,  700, SEEK_SET);
    read( fd, buf2,  100);
    A lseek,B A read lseek, ( , )。
    :
    pread--
    A
    pread( fd, buf1, 100, 300);
    B
     pread( fd, buf2, 100, 700);

8.  
 
    ,  
    1) 2) , , ,
    , 2 :
    , ,
    pthread_sigmask
    sigwait .  ,sigwait ,
    pthread_kill
    sigwait(sigset_t*, int* signo)
    sigwait 2
 
9.   fork
    pthread_atfork, ,
    fork , 。 、 。
    , , fork , exec ( ) , 。
    pthread_atfork( void (*prepare)(void),  void (*parent)(void), void (*child)(void) );
      3 。 
    prepare fork fork , : 。
    parent fork: fork , fork , 。
    child fork : fork , fork , 。
 
10.  

11.