Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2013, 19:18   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию Многопоточность, разделяемые данные

Здравствуйте!
Вопрос ,возможно, не конкретно по winapi, но рядом, потому что тот кто использует win api должен дружить с многопоточностью, имхо.
Дано:
-два потока, имеют разделяемый сегмент памяти (какая-нибудь структура);
-первый поток читает эту структуру, а второй перезаписывает (одновременно).
Вопрос:
Есть ли у меня гарантия, что структура будет содержать корректные данные (идентичные тем, которые записывал второй поток). Т.е. ошибку, возможно, схватит читающий поток, но данные будут записаны правильно. Есть ли у меня такая гарантия?
P.S: тот, кто не уверен, не пишите пожалуйста, очень не хочу запутаться.
220Volt вне форума Ответить с цитированием
Старый 05.01.2013, 21:31   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Нет, у вас нет таких гарантий, если только вы не используете механизмы синхронизации доступа.
waleri вне форума Ответить с цитированием
Старый 06.01.2013, 06:46   #3
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Ясно, спасибо.
220Volt вне форума Ответить с цитированием
Старый 06.01.2013, 10:48   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

А я вот считаю с точностью до наоборот.
Если корректность чтения нас не волнует, синхронизация не нужна.
Это и проверить не трудно.
Код:
#include <iostream>
#include <process.h>
#include <memory.h>

struct STR
{
	int x;
	int y[100];
};

// общие данные
volatile STR mystr;

void thrdproc(void*)
{	// читающий поток
	while (1)
	{   // корректность чтения нас не волнует
		STR tmp;
		memcpy(&tmp,(const void*)&mystr, sizeof(STR));
	}
}

int main()
{	
	_beginthread(thrdproc, 0, 0);
	
	for (unsigned int i = -1; i --;)
	{
		STR tmp = {i, -1 - i}; 
		// записать
		memcpy((void*)&mystr, &tmp, sizeof(STR));
		// проверить записанное
		if (memcmp((void*)&mystr,&tmp, sizeof(STR)))
		{
			std::cout << "ERROR";
			break;
		}
	}
	return 0;
}
Цитата:
Т.е. ошибку, возможно, схватит читающий поток, но данные будут записаны правильно.
EUGY вне форума Ответить с цитированием
Старый 06.01.2013, 11:59   #5
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Благодарю за пример (как-то не додумался сделать тест), попробовал, все гладко.
220Volt вне форума Ответить с цитированием
Старый 06.01.2013, 20:26   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Беру свои слова обратно - раз вам пофиг, что вы читаете garbage тогда конечно никакой синхронизации не нужно... Только тогда зачем их вообще читать...
waleri вне форума Ответить с цитированием
Старый 06.01.2013, 20:34   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Я понял так, что 220Volt опасается, что пищущий поток запишет некорректно, если вдруг в это же время кто-то прочтет эти адреса. Вот и успокоил человека.
А так-то конечно трудно представить практический смысл.
EUGY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность garyanikin Работа с сетью в Delphi 5 16.11.2012 14:24
многопоточность MasterSporta Общие вопросы C/C++ 4 30.09.2011 13:27
Многопоточность nats C# (си шарп) 5 25.06.2011 11:51
Многопоточность alex0097 Общие вопросы Delphi 3 05.05.2011 22:46