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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 13.05.2016, 16:59   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию Сылка на обьект в обеих потоках

Доброй ночи !

Есть такая интересная ситуация.

Предположим в потоке 1 и 2 есть ссылка на внешнюю структуру.

Могут ли быть глюки при одновременном использовании этой ссылки

в потоках, если с помощью этой ссылки обращаться к разным полям

структуры из потоков?
RAFA91 вне форума
Старый 13.05.2016, 19:04   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

нет.
глюков не будет.

однако, на некоторых архитектурах может быть просадка производительности,
в связи с тем, что при изменении объекта в потоке одного ядра,
поток другого ядра будет заново затягивать его в кэш процессора.

то есть, изменение одного поля может повлечь за собой подкачку всего объекта
в кэш ядра процессора.

поэтому, если вы гарантируете, что два потока работают с разными полями,
то есть смысл сделать так,
что бы они гарантированно работали с разными объектами.
_Bers вне форума
Старый 14.05.2016, 06:27   #3
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Bers, только вы не учитываете битовые поля. Официальное пояснение примерно такое:

Разным потокам разрешен доступ (чтение и запись) к разным memory location (хз как корректно перевести) без всяких синхронизационных требований. Небезопасно одновременно обновлять (один из потоков пишет) два неатомарных битовых поля одной структуры если все члены объявленные между ними так же битовые поля (ненулевого размера), не важно какой размер у этих промежуточных битовых полей.

Когда один поток пишет в memory location и другой поток пишет или читет в неё же, то возникает data race если следующее не выполненно:
1. две конфликтующих операции атомарные
2. одна операция случается happens-before другой (смотреть memory_order)
Код:
struct S {
    char a;     // memory location #1
    int b : 5;  // memory location #2
    int c : 11, // memory location #2 (continued)
          : 0,
        d : 8;  // memory location #3
    struct {
        int ee : 8; // memory location #4
    } e;
} obj; // The object 'obj' consists of 4 separate memory locations
Цитата:
однако, на некоторых архитектурах может быть просадка производительности,
в связи с тем, что при изменении объекта в потоке одного ядра,
поток другого ядра будет заново затягивать его в кэш процессора.
Не думаю, что стоит заморачиваться по этому поводу. ЦПУ не обязан синхронизировать все кеши, а с/c++ ввёл memory_order. Видимо тренд в сторону weakly-ordered цпу.

ЗЫ:
Цитата:
поэтому, если вы гарантируете, что два потока работают с разными полями,
то есть смысл сделать так,
что бы они гарантированно работали с разными объектами.
Кстати, если применять подобный метод, то следить нужно не за тем чтобы данные находились в разных объектах, а затем чтобы они находились в разных кэш-линиях. ЦПУ ведь ничего не знает о наших объектах и перекидывает данные целыми кэш-линиями. Например, задать выравнивание равное размеру кэш-линии
Код:
struct Data
{
    alignas(64) int i_1;
    alignas(64) int i_2;
};

Последний раз редактировалось 220Volt; 14.05.2016 в 09:14.
220Volt вне форума
Старый 14.05.2016, 13:10   #4
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
нет.
глюков не будет.
время покажет.

Если имеем дело с многоядерным ЦПУ то два ядра могут одновременно

использовать ссылку объекта и обращаться к полям структуры.

Иногда мне надо обращаться и к совместным полям.

Поэтому создавать два разных объекта не вижу смысла.

Только ссылки.

___________________________________ ___________

Если я вхожу в зону совместных данных так

WaitForSingleObject(hEvent, INFINITE);


а выхожу так

SetEvent(hEvent);


Если мы имеем дело с несколькими ядрами , то могут ли два ядра войти

в совместную зону данных при одновременном обращении к

WaitForSingleObject(hEvent, INFINITE);

надеюсь меня поняли что я имею ввиду
RAFA91 вне форума
Старый 14.05.2016, 13:34   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Для этого надо мьютекс использовать а не сигнал. Сигнал могут принять несколько потоков (в зависимости от параметров) а мьютекс гарантированно всегда только один.
waleri вне форума
Старый 14.05.2016, 13:38   #6
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

а событие что не то ?

хорошо бы взглянуть на факты что реально два ядра перешагнут за .

WaitForSingleObject(hEvent, INFINITE); в своих потоках

одни предпочитают светофоры а другие события.

я склоняюсь ко второму.
RAFA91 вне форума
Старый 14.05.2016, 14:20   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
хорошо бы взглянуть на факты что реально два ядра перешагнут за .
если тип события ручной-сброс то легко. в автосбросе всегда один проходит.
и это гарантировано.(как и сказали в зависимости от параметров)

но у мютекса есть гарантия что его может освободить только поток что захватил его.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума
Старый 14.05.2016, 14:46   #8
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение

Если мы имеем дело с несколькими ядрами , то могут ли два ядра войти

в совместную зону данных при одновременном обращении к

WaitForSingleObject(hEvent, INFINITE);

надеюсь меня поняли что я имею ввиду
CreateEvent(NULL, false, true, NULL); // автосброс


ответ нужен в виде фактов а не догадок, так как от этого зависит

пропускная способность ГАЦ.
RAFA91 вне форума
Старый 14.05.2016, 17:33   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы тогда перечитайте мое сообщение, там вполне четкий ответ.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума
Старый 14.05.2016, 22:47   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
ответ нужен в виде фактов а не догадок
Ну, если вы такой умный зачем вы у нас спрашиваете... Догадки в основном с вашей стороны...
waleri вне форума
Закрытая тема


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка изображения или сылка на изображение xakkkkker Работа с сетью в Delphi 5 14.01.2013 23:04
Печать на обеих сторонах agregator Microsoft Office Excel 1 24.11.2010 11:03
php5 постоянная сылка на переменную 13th Свободное общение 1 13.09.2010 18:15
Сылка на внешний файл в отчете Iskin Microsoft Office Access 0 30.03.2009 08:03