Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

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

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

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

А я вот считаю с точностью до наоборот.
Если корректность чтения нас не волнует, синхронизация не нужна.
Это и проверить не трудно.
Код:
#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
Адрес: Россия
Сообщений: 683
Репутация: 199
По умолчанию

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность 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


13:07.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.