2013年12月30日月曜日

ビット演算:ビットの置換

ビットを指定して置換する例題です。

以下の例題では、8ビット内の開始位置、長さを指定して値を挿入しています。
挿入する値が指定した長さのビットの値より大きい場合には、値を変更しないようになっています(repBits 内 bitsthr でのチェック)。 実行結果

スレッドの停止:pthread_cancel/pthread_kill

pthread によるスレッド処理を強制的に停止する例題です。

POSIX スレッド標準を実装したライブラリ pthreads は、pthread_cancel によりスレッドを強制的に停止することが可能ですが、処理系によっては実装されていない場合があります。
※ Android の NDK では標準的に pthreads を利用できる形になりますが、pthread_cancel は実装されていません。
 ライブラリのサイズが大きくなるのと、OS 内でのプロセス管理が複雑になる等の理由により実装されていないようです。

実装されていない場合には pthread_kill により(USE_THCANCEL = 0)スレッドを停止することも考えられますが、この処理も処理系によっては上手く動作しない可能性があります。

以下の例題では、while 文での処理内に sleep による待ち時間を設けながら処理を行っているので、pthread_cancel が使えない場合には処理を即座に停止することが困難になります。
※ OSX/Linux 等では正常に動作するが、Android/NDK では正常にスレッドが停止されずに pthread_kill の部分でループが終了しない状態となります。
pthread_cancel が実装されていない Android/NDK にてこのような処理を行う場合には、pthread によるタイマー的な動作は諦めて、Java 側での Handler による遅延実行から NDK 処理を行う等の方法に切り替えることをお薦めします。 実行結果