linux学習ノートのスレッド

12460 ワード

スレッド同期メカニズム:http://www.cnblogs.com/zheng39562/p/4270019.html
 
一、基礎知識
1:基礎知識
スレッドに必要な情報は、スレッドID、レジスタ、スタック、スケジューリング優先度とポリシー、信号遮蔽、errno変数、スレッドプライベートデータです.
2,プロセスのすべての情報はスレッドに共有されます.
3,マルチスレッドがサポートされているかどうかは、次の2つの方法でテストされます.
1)コンパイルする時確定:〹ifdef_POSIX_THREADS
2)運転時確定:syssconf関数呼び出し_SCTHREADSはよく使われています
4,スレッドID.
1)プロセスにおいて、スレッドIDは一意性を有する.スレッドIDはプロセスに依存してこそ意味があります.
2)スレッドID表示タイプ:pthread_tタイプ
5、変数インクリメンタル動作のステップ:
1)変数値はメモリユニットからレジスタに読み込まれます.
2)レジスタで変数を変更します.
3)変数値をメモリユニットに書き込みます.
4)複数のスレッドが同じ変数を同時に修正しようとする場合、同期が必要です.
6,プロセスリソースとスレッドの関係:
1)スレッドごとに自分の信号シールドがあります.ただし、信号処理は全てのスレッドで共有されている.したがって、スレッドの信号処理はスレッド全体に影響を及ぼします.
2)目覚まし時計のタイミングはプロセス資源です.すべてのスレッドを共有して使用します.
3)pread/pwrite関数はマルチスレッドでの読み書きが適しています.複数のスレッドの読み書きオフセットを保存することができるので、上書きされないことを保証します.
2:スレッドの作成と終了.
1,スレッド作成.
1)どのスレッドが先に実行されているかは確認できません.
2)関数createの作成に失敗した場合、通常はエラーコードを返します.
スレッドが終了します.
1)任意のスレッドがexitを呼び出し、_Exitexit関数はプロセスを終了させます.(このようにして単一スレッドを終了することはできません.)
2)起動ルーチンから戻ります.値を返すとスレッドがコードを終了します.
3)同じプロセスの他のスレッドによってキャンセルできます.
4)スレッド呼び出しpthread_exit関数
3:スレッドのデータとセキュリティ
1,スレッドセキュリティ:同じ時点で関数を複数のスレッドで安全に起動できます.
1)関数が再入力可能である場合、それはスレッドの安全です.
2)非同期信号の安全性.
 
2,関数の再入力ができます.
 
1)処理信号が中断された場合、一部の関数が情報を変更することがあり、中断処理が終了した後、プログラム(情報が間違っている)を正しく中断点から実行できなくなります.
 
2)再入力可能関数は、再中断中にこれらの関数を呼び出しても、情報のビットずれにならないことを保証します.
 
3)再入力可能関数は、非同期信号セキュリティの関数とも呼ばれる.
 
3,スレッドプライベートデータ:具体的な操作は関数を参照してください.
5:プロセスとスレッド機能/関数対応表
プロセス原語
スレッド原語
説明
fork
pthread_create
新しいコントロールストリームを作成します.
exit
pthread_exit
先にコントロールフローがあってから退出します.
waitpid
pthread_ジョン
コントロールフローから終了状態を得る
at ext
pthread_キャンセルするプッシュする
制御フローの終了時に呼び出す関数を登録します.
get pid
pthread_self
制御ストリームのIDを取得する
abort
pthread_キャンセル
制御ストリームの非正常終了を要求する.
 
 
二、相関関数.
1:スレッド操作関数.
1     ID  。

  int pthread_equal( pthread_t tid1, pthread_t tid2 )

2       ID。

  pthread_t pthread_self( void );

3     。

  int pthread_create( pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);

  // 1   arg             

4     。   

  void pthread_exit( void *rval_ptr ); 

5         。   

  int pthread_join( pthread_t thread, void **rval_ptr );   

  // 1   rval_ptr     。 

6       (      )   

  int pthread_cancel( pthread_t tid );   

  // 1       。      。 

7         (     atexit)。   

  void pthread_cleanup_push( void (*rtn)(void *), void *arg);   

  void pthread_cleanup_pop( int execute );   

  // 1   execute=0 ,         。   

  // 2     pop   ,       push     。   

  // 3          。    {}   。   

  // 4               。 

8     。   

  int pthread_detach( pthread_t tid );

9        

  int pthread_atfork( void (*prepare)(void), void (*parent)(void), void (*child)(void) );   

  // 1          。

10      。       ,         ,          。
 
 
2,スレッド属性相関関数.
1                 

  int pthread_attr_init( pthread_attr_t *attr );

  int pthread_attr_destroy( pthread_attr_t *attr );

2   /       。

  int pthread_attr_getdetachstats( const pthread_attr_t *restrict attr, int *detachstate );

  int pthread_attr_setdetachstats( pthread_attr_t *attr, int *detachstate );

  // 1   detachstate     :PTHREAD_CREATE_ DETACHED/JOINABLE.

3   /         stackaddr。

  int pthread_attr_getstack( const pthread_attr_t *restrict attr, void **restrict stackaddr, size_t *restrict stacksize );

  int pthread_attr_setstack( pthread_attr_t *attr, void *stackaddr, size_t stacksize );

  // 1 stackaddr               。     ,               。     (     )

4   /         stacksize。

  int pthread_attr_getstacksize( const pthread_attr_t *restrict attr, size_t *restrict stacksize );

  int pthread_attr_setstacksize( pthread_attr_t *attr, size_t stacksize );

5   /              guardsize。

  int pthread_attr_getguardsize( const pthread_attr_t *restrict attr, size_t *restrict guardsize );

  int pthread_attr_setguardsize( pthread_attr_t *attr, size_t guardsize );
 
3:スレッドプライベートデータ.
1      

  int pthread_key_create( pthread_key_t *keyp, void (*destructor)(void *));

  // 1           (     )

  // 2           :    KEY             。

2              。

  int pthread_key_delete( pthread_key_t key );

  // 1           。

3           :           。

  int pthread_once( pthread_once_t *initflag, void (*initfn)(void));

4   /       。

  void *pthread_getspecific( pthread_key_t key );

  int pthread_setspecific( pthread_key_t key , const void *value );
 
4:特殊スレッド属性:キャンセル可能状態とキャンセル可能タイプ.
1         

  int pthread_setcancelstate( int state, int *oldstate );

  // 1        : PTHREAD_CANCEL_ ENABLE/DISABLE 

2          。

  void pthread_testcancel( void );

  // 1       :       ,              (        )。

3       。

  int pthread_setcanceltype( int type, int *oldtype )
 
 
5:スレッドと信号
1         

  int pthread_sigmask( int how, const sigset_t *restrict set, sigset_t *restrict oset );

2     。

  int sigwait( const sigset_t *restrict set, int *restrict signop );

  // 1   set          。

  // 2   signop          。

  // 3       ,           。(   )

  // 4       ,           。

3        。

  int pthread_kill( pthread_t thread, int signo );

  // 1   signo  0,          
 
 三、