Mutex
概要
Mutexを使うGlib::Muntexによって排他処理を行えるが、「Glib::thread_init()を呼ぶ前にGlib::Muntexを作ると例外が出る」。 従ってメンバ変数やグローバル変数でMuntexを作りたいときは代わりにGlib::StaticMutexを使う。
なおロックする際はGlib::Mutex::Lockを使うとアンロックし忘れを予防できるので便利である。
ソース
thread2.cpp#include <gtkmm.h> #include <iostream> // gettid #include <sys/types.h> #include <linux/unistd.h> _syscall0(pid_t,gettid) // Glib::thread_init() する前は Glib::Mutex を作れないので // 代わりに Glib::StaticMutex を作る Glib::StaticMutex MyMutex = GLIBMM_STATIC_MUTEX_INIT; void slot_thread() { Glib::Mutex::Lock lock( MyMutex ); for( int i = 0; i < 4 ; ++i ){ std::cout << "thread tid = " << gettid() % 10 << std::endl; sleep( 1 ); } std::cout << "thread stop(" << gettid() %10 << ")" << std::endl; } int main() { // スレッドシステムの初期化 Glib::thread_init(); std::cout << "main tid = " << gettid() << std::endl; Glib::Thread* thread = Glib::Thread::create( sigc::ptr_fun( &slot_thread ), true ); Glib::Thread* thread2 = Glib::Thread::create( sigc::ptr_fun( &slot_thread ), true ); Glib::Thread* thread3 = Glib::Thread::create( sigc::ptr_fun( &slot_thread ), true ); thread->join(); thread2->join(); thread3->join(); std::cout << "main stop(" << gettid() << ")" << std::endl; }
コンパイル
必要なコンパイルオプションは pkg-config を使って取得する。今回はスレッドを 使用しているので pkg-config --libs gthread-2.0 の指定も必要である。g++ thread2.cpp -o thread2 `pkg-config gtkmm-2.4 --cflags --libs` `pkg-config --libs gthread-2.0`
結果
mutexを有効にした場合はmain tid = 16874 thread tid = 5 thread tid = 5 thread tid = 5 thread tid = 5 thread stop(5) thread tid = 6 thread tid = 6 thread tid = 6 thread tid = 6 thread stop(6) thread tid = 7 thread tid = 7 thread tid = 7 thread tid = 7 thread stop(7) main stop(16874)一方、Glib::Mutex::Lock lock( MyMutex );の行を消してmutexを無効にした場合は
main tid = 16789 thread tid = 0 thread tid = 1 thread tid = 2 thread tid = 0 thread tid = 1 thread tid = 2 thread tid = 0 thread tid = 1 thread tid = 2 thread tid = 0 thread tid = 1 thread tid = 2 thread stop(0) thread stop(1) thread stop(2) main stop(16789)