Многопоточность в C++ - довольно нетривиальная вещь, так как сам язык не дает (пока) абсолютно ничего для этого. Типичная подход - защита совместно используемых объектов критическими секциям. При неаккуратном обращении с ними недалеко до простоя потоков, а иногда и до deadlock-ов.
Как в свое время все вызовы new/delete упаковали в умные указатели, можно так же поступить и с критическими секциями, оставив для общения потоков такой вот простой интерфейс:
template <typename T>(можно отказаться от шаблона в пользу IMessage вместо T - это на свой вкус и цвет).
void SendMessage(Thread, std::auto_ptr<T> Message);
Послали сообщение - и бежим дальше, никаких лишних простоев.
PS. Почему auto_ptr, а не копия объекта: не всегда нужна копия, часто сообщение готовится только для того чтобы быть посланным - нет смысла делать оверхед в виде копии. А уж если нужна копия, то все просто:
SendMessage(SomeThread, Сlone(Message));(или Message.Сlone(), у кого как)
2 комментария:
можно еще посмотреть на библиотеки channel и join - http://channel.sourceforge.net/
Да, как и в случае с умными указателями - полезно воспользоваться готовыми библиотеками. Спасибо за ссылку.
Отправить комментарий