Буквально неделю назад познакомился с GTK. Начал изучать, все очень нравится, но вот недавно наткнулся в руководстве по GDK (часть Threads) на такой текст:
...
GLib is completely thread safe (all global data is automatically locked), but individual data structure instances are not automatically locked for performance reasons. So e.g. you must coordinate accesses to the same GHashTable from multiple threads.
GTK+ is "thread aware" but not thread safe — it provides a global lock controlled by gdk_threads_enter()/gdk_threads_leave() which protects all use of GTK+. That is, only one thread can use GTK+ at any given time.
Unfortunately the above holds with the X11 backend only. With the Win32 backend, GDK calls should not be attempted from multiple threads at all.
...
Т. е., если я правильно понял, я не смогу написать многопоточное приложение GTK под Windows, в котором каждый поток сможет модифицировать интерфейс программы?
Т. е., если я правильно понял, я не смогу написать многопоточное приложение GTK под Windows, в котором каждый поток сможет модифицировать интерфейс программы?
Я так понимаю достаточно лишь разнести критичные (для GTK) участки кода потоков.
Раз GTK не потокобезопасна, значит нужно самому обеспечить эту "потокобезопасность" и всё.
Раз GTK не потокобезопасна, значит нужно самому обеспечить эту "потокобезопасность" и всё.
Т. е. самому поставить семафоры перед вызовами GTK функций?
P.S.: Вы уж извините, что задаю такие глупые вопросы. Дело в том, что я ещё ни разу не писал ничего относительно серьёзного под Windows, но есть высокая вероятность того, что в будущем придется портировать программу под неё, и очень хотелось бы быть уверенным, что для этого не придется переписывать всю программу заново.
Обычно главный тред программы отвечает за GUI, а остальные треды лишь посылают ему сообщения, которые он и обрабатывает. При таком дизайне проблем не возникает.
Обычно главный тред программы отвечает за GUI, а остальные треды лишь посылают ему сообщения, которые он и обрабатывает. При таком дизайне проблем не возникает.
Т. е. используются средства IPC? Но это же сильно усложняет код программы, т. к. нужно на стороне потоков кодировать GTK комманды в сообщения, а на стороне главного потока эти сообщения декодировать в GTK комманды. Или я вас не правильно понял?