char str[256]; //общий объект
strcpy(str, "Hello");
...
sprintf(str, "%s", someStr); //<-здесь
Синхронизация потоков
Сегодня начал разбираться с многопоточностью и, в частности, с синхронизацией потоков. Понятно, что синхронизация необходима в том случае, когда несколько потоков изменяют один и тот же объект. А вот в моей программе всего два потока имеют доступ к одному и тому же объекту, причем один поток только записывает данные в этот объект, а второй поток только считывает их, приэтом не важно считаются эти данные чуть раньше или чуть позже. Вопрос: в моем случае синхронизация тоже необходима?
Предположим, это строка. Записывающий поток делает простую операцию
Код:
Предположим, во время выполнения sprintf первый поток будет прерван, а второй начнет чтение. Вопрос: что получит второй поток. Ответ: некоторый промежуточный вариант строки.
Для варианта приведенного _const_ более подходит использование Critical Section. Да и в твоем скорее всего тоже.
Теперь возник такой вопрос:
Есть такой класс наследуемый от 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;
}
В данном случае это излишне,хватит и одного EnterCriticalSection в потоке где используется класс CShopDeviceMas перед началом работы с ним
Спасибо!