スレッドなプログラミング

(注意)本人の知識不足やお酒を飲みながら書いてるので誤情報がある可能性があります。間違い指摘募集中:-)
Linuxでのマルチコア環境でスレッド操作の必要があって調べてたのでメモ。
まずUNIX系ではPOSIXなスレッド操作としてpthreadなるものが準備されてます。スレッド作成は以下の通り

#include <pthread.h>

pthread_create( &thread_id, &attr, &func, &arg);

簡単にスレッドが作成できます。引数等の説明はmanを引くなりmanpageを見るなり(情報としてはどっちもmanですねw)してください。attrでは優先度とかスタックに関するなんかが設定できたりします。
で、今回の条件はLinux環境で動作するコアを指定するというものなのですが、UNIXなpthreadにはコアを指定するような関数は用意されてません(タブン)。
で、Liunxな訳ですがLinuxにはKernel2.6以降でプロセッサーアフィニティーの設定がサポートされていてこれを使うことでプロセスが利用するCPUの指定ができます。コアもCPUとしてみなされているっぽいのでこれで設定できます。設定は以下の通り

#include <sched.h>

sched_setaffinity( pid, spusetsize , *cpu_mask );

これでPIDのプロセスに対してcpu_maskで設定されたCPUで動くように制限できます。maskの設定は

CPU_SET( cpu_num , *cpu_mask );

これで割り当てを許可するCPUの追加を行います。cpu_maskでは割り当てを許可するCPUの指定なので複数のCPUがセット可能です。CLRで割り当てを削除したりINITで初期化することも可能です。
ここで問題がひとつ。schedでのアフィニティーの設定はPIDを指定しますが、本来スレッドはPIDは同じのはず。さてどうしましょうということで以下ちょっとPIDとかの話。といいつつ疲れたのでちょっと休憩w