| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Синхронизировать или нет? |
| Автор: ksili 26.10.2007, 08:05 |
| Вопрос такой. Программа создаёт несколько дочерних потоков. В основном потоке есть глобальная структура (даже массив структур). В каждый поток передается указатель на эту структуру. В процессе работы потоки к ней обращаются. Надо ли синхронизировать такие обращения? Это же ведь не обращение к VCL... У меня пока синхронизированы (запихнуты в Synchronize) только изменения этой структуры из дочерних потоков. Надо ли ещё синхронизировать и чтения? |
| Автор: Lazin 26.10.2007, 08:35 | ||||||||||||||
| Через Synchronize нужно синхронизировать только те объекты которые используют очередь сообщений. Все глобальные объекты нужно синхронизировать по другому, например с помощью критических секций (TCriticalSection или API ф-ий). Иногда логика программы требует блокировки других потоков. например
код потока
Другой пример, если один поток читает std::vector, а другой добавляет элементы в него то может произойти ошибка доступа (если произойдет realloc). В то-же время можно спокойно читать вектор из нескольких потоков.
1 поток - читает
2 поток - добавляет
здесь элемент в вектор добавлен не будет, пока не выполнится первый поток, в то-же время произвольное число потоков может читать вектор. Еще один пример
Представь что объект Obj используется несколькими потоками и оба вызывают метод Method, произойдет вот что: оба потока проверят условие примерно в одно время, и flag == true для обоих проблема решается критической секцией
В общем нужно искать разумный компромис, если слишком сильно все защищать, толку от многопоточности не будет, с другой стороны возможны самые неожиданные глюки. В общем нужно сводить к минимуму совместно используемые данные, применять глубокое копирование, выделять объекты которые могут совместно читаться из разных потоков, и тд. |
| Автор: Lazin 26.10.2007, 09:03 |
| Если структура содержит только POD то можно попробовать вообще без синхронизации, если что-то более сложное, то в структуру нужно добавить объект для синхронизации, и дергать данные не напрямую а через методы get/set. |
| Автор: ksili 26.10.2007, 09:06 | ||
Где есть про это поподробнее? Или пример? POD - это имелись в виду просто данные? P.S. Почему здесь в коде C++Builder выделяется жирным слово lock. У меня в Билдере оно не выделяется... |
| Автор: Lazin 26.10.2007, 09:51 |
| Plain Old Data http://www.codeproject.com/threads/Synchronization.asp |