Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Синхронизация потоков

10K
26 сентября 2006 года
yaga
12 / / 04.08.2005
Добрый день!
Сегодня начал разбираться с многопоточностью и, в частности, с синхронизацией потоков. Понятно, что синхронизация необходима в том случае, когда несколько потоков изменяют один и тот же объект. А вот в моей программе всего два потока имеют доступ к одному и тому же объекту, причем один поток только записывает данные в этот объект, а второй поток только считывает их, приэтом не важно считаются эти данные чуть раньше или чуть позже. Вопрос: в моем случае синхронизация тоже необходима?
1.8K
26 сентября 2006 года
_const_
229 / / 26.11.2003
Да.
Предположим, это строка. Записывающий поток делает простую операцию
 
Код:
char str[256]; //общий объект
strcpy(str, "Hello");
...
sprintf(str, "%s", someStr); //<-здесь

Предположим, во время выполнения sprintf первый поток будет прерван, а второй начнет чтение. Вопрос: что получит второй поток. Ответ: некоторый промежуточный вариант строки.
406
26 сентября 2006 года
vitaly2003s
481 / / 27.07.2004
Для варианта приведенного _const_ более подходит использование Critical Section. Да и в твоем скорее всего тоже.
10K
27 сентября 2006 года
yaga
12 / / 04.08.2005
Большое спасибо, с этим случаем я разобрался.
Теперь возник такой вопрос:

Есть такой класс наследуемый от CArchive:

class CShopDeviceMas : public CArray<CShopDevice*,CShopDevice*>
{
public:
CShopDeviceMas();
virtual ~CShopDeviceMas();

BOOL Load(CString Dir);
BOOL Save(CString Dir);
……….

К объекту этого класса действительно могут захотеть одновременно обратиться сразу несколько потоков. Поэтому во всех методах я использовал критические секции.
Но ведь из потоков могут вызываться также и функции родительского класса например ADD, GetAt…
Правильно ли я сделал, что перегрузил эти функции?
Например так:

int CShopDeviceMas ::Add(CShopDevice *ShopDevice)
{
::EnterCriticalSection(&CS);
int res=CArray CArray<CShopDevice*,CShopDevice*>::Add(ShopDevice);
::LeaveCriticalSection(&CS);
return res;
}
406
27 сентября 2006 года
vitaly2003s
481 / / 27.07.2004
В данном случае это излишне,хватит и одного EnterCriticalSection в потоке где используется класс CShopDeviceMas перед началом работы с ним
10K
27 сентября 2006 года
yaga
12 / / 04.08.2005
Спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог