Re[8]: Изменение errno
От: MaximE Великобритания  
Дата: 20.01.05 12:23
Оценка: -1 :))) :))
MaximE wrote:

>

>
> Мы все еще ждем от тебя примеров кода, подтверждающие, что при использовании синхронизации нужен еще и volatile.

... или признаем твою неправоту по таймауту

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[12]: [2]: : volatile: а можно примеры?
От: Andrew S Россия http://alchemy-lab.com
Дата: 20.01.05 12:27
Оценка:
AS>>V2. Переменная объявлена не как volatile. Соотв, параметры InterlockedXxx без volatile (например, как это было в PSDK 2-х летней давности. Теперь это не так и вынуждает программистов использовать volatile для этих функций.

A>С какой радости? Преобразования указателей от менее cv-квалифицированных к более cv-квалифицированным происходят неявно.


Ну, не вынуждает, а поощряет, скажет так.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[13]: [2]: : volatile: а можно примеры?
От: MaximE Великобритания  
Дата: 20.01.05 12:37
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>>>V2. Переменная объявлена не как volatile. Соотв, параметры InterlockedXxx без volatile (например, как это было в PSDK 2-х летней давности. Теперь это не так и вынуждает программистов использовать volatile для этих функций.


A>>С какой радости? Преобразования указателей от менее cv-квалифицированных к более cv-квалифицированным происходят неявно.


AS>Ну, не вынуждает, а поощряет, скажет так.


Как конкретно поощряет?
Re[14]: [2]: : volatile: а можно примеры?
От: Andrew S Россия http://alchemy-lab.com
Дата: 20.01.05 12:45
Оценка:
AS>>>>V2. Переменная объявлена не как volatile. Соотв, параметры InterlockedXxx без volatile (например, как это было в PSDK 2-х летней давности. Теперь это не так и вынуждает программистов использовать volatile для этих функций.

A>>>С какой радости? Преобразования указателей от менее cv-квалифицированных к более cv-квалифицированным происходят неявно.


AS>>Ну, не вынуждает, а поощряет, скажет так.


ME>Как конкретно поощряет?


http://www.rsdn.ru/Forum/Message.aspx?mid=982608&only=1
Автор: Шахтер
Дата: 12.01.05
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: Поведение C++ runtime
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 20.01.05 12:54
Оценка:
Здравствуйте, Костя Ещенко, Вы писали:

КЕ>Объявление/определение функции из стандартной библиотеки С, например strlen, в глобальном или ::std неймспейсах с внешней компоновкой приводит к ub. Это значит что можно создать strlen только либо в своем неймспейсе, либо локальную, либо статическую (с внутренней компоновкой).

КЕ>В 17.4.3 вообще куча страшилок, но new/delete и некоторые другие специально разрешено переопределять.

Спасибо за информацию. Теперь буду знать.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[13]: [2]: : volatile: а можно примеры?
От: achp  
Дата: 20.01.05 13:04
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Ну, не вынуждает, а поощряет, скажет так.


Не поощрает, а идёт навстречу.
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Re[14]: [2]: : volatile: а можно примеры?
От: Andrew S Россия http://alchemy-lab.com
Дата: 20.01.05 13:09
Оценка:
AS>>Ну, не вынуждает, а поощряет, скажет так.
A>Не поощрает, а идёт навстречу.
И чего ж она, болезная, раньше не шла, а теперь вот нате? Ужо какие-ить грабли обнаружила в закромах родины
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[8]: Изменение errno
От: emusic Франция https://software.muzychenko.net/ru
Дата: 20.01.05 18:21
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Мы все еще ждем от тебя примеров кода, подтверждающие, что при использовании синхронизации нужен еще и volatile.


Какой именно синхронизации? Если посредством внешних функций-примитивов, то я согласен, что очень сложно будет найти столь смелый оптимизатор, который решился бы протащить через вызов подобной функции сохраненное значение нелокальной переменной. Однако здесь ты уже, заметь, апеллируешь отнюдь не к стандарту (по которому, благодаря отсутствию там многопоточности, можно было бы в некоторых случаях такую оптимизацию делать), а к популярным реализациям, которые не враги себе, и заинтересованы, чтобы у народа работали минимально пристойные программы.

Однако синхронизация не обязана быть на уровне ОС посредством ее примитивов. Она может быть, например, на голой аппаратуре — вроде того, как в ядре NT/2k/XP реализованы спинлоки. Реально они для эффективности сделаны на ассемблере, но могут быть сделаны и на C/C++. Тут без volatile никуда не денешься. А определив глобальную функцию, которая работает с volatile-переменной синхронизации, можно уже с помощью этой функции синхронизироваться без volatile.

Я же говорю — общее и частное. С утверждением "в многопоточной среде, где синхронизация выполняется посредством внешних функций, разделяемые переменные защищать volatile не обязательно".
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[9]: volatile
От: Seriously Serious  
Дата: 20.01.05 18:45
Оценка:
В таком случае, есть ли какое-нибудь полезное применение volatile на UDT? (в смысле, чтобы можно было только функции с volatile вызывать)
Re[10]: volatile
От: emusic Франция https://software.muzychenko.net/ru
Дата: 20.01.05 19:14
Оценка:
Здравствуйте, Seriously Serious, Вы писали:

SS>В таком случае, есть ли какое-нибудь полезное применение volatile на UDT? (в смысле, чтобы можно было только функции с volatile вызывать)


А кто у нас такой UDT?
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[9]: Изменение errno
От: Аноним  
Дата: 20.01.05 19:35
Оценка:
Здравствуйте, MaximE, Вы писали:

izvinyajusj za translit. Tak kto okazalsya pravee?

ME>MaximE wrote:


>>

>>
>> Мы все еще ждем от тебя примеров кода, подтверждающие, что при использовании синхронизации нужен еще и volatile.

ME>... или признаем твою неправоту по таймауту


ME>--

ME>Maxim Yegorushkin
Re[11]: volatile
От: Seriously Serious  
Дата: 20.01.05 19:59
Оценка:
Здравствуйте, emusic, Вы писали:

E>А кто у нас такой UDT?

user-defined type
Re[10]: [2]: : volatile: а можно примеры?
От: c-smile Канада http://terrainformatica.com
Дата: 20.01.05 20:26
Оценка:
Здравствуйте, eao197, Вы писали:

E>А с этим я никогда и не спорил. Поэтому еще раз проясню свою позицию: я хочу увидеть реальные примеры (из реальных, а не тестовых примеров), когда использовались примитивы синхронизации, но приложение все равно работало не правильно до тех пор, пока не было использовано volatile. При этом меня не интересуют ни обработчики аппаратных прерываний, ни работа с железом через отображаемые в память порты ввода/вывода.


E>Прошу не приводить примеров, когда компилятору специальными ключами явно указывали, что ни одна функция не имеет побочных эффектов. Применение такого ключа в многопоточной программе, ИМХО, является проявлением излишнего оптимизма программиста. Кроме того, такой пример я уже видел. Может есть что-то еще?


На моей задаче aliasing оптимизация дает 16% прирост производительности. Поэтому без этой оптимизации я даже и не компилирую.
http://terrainformatica.com/htmlayout

Вот фрагмент кода который без volatile просто не компилируется: например метод locked::dec(volatile long& cnt);
Использование критической секции вокруг mutex для проверки флагов active и terminate было протестировано и признано неоправданным — потеря производительности.

Попытка использовать голые (не volatile) флаги вызывала очень странный behavior.
Вообще когда multithreading нечто начинает вести себя странно — ищи где ты забыл поставить volatile.


namespace tool {

class thread_pool
{
private:
    array<HANDLE>         thread_handles;
    array<task*>          tasks;
    mutex                 guard;
    event                 got_something;
    volatile long         terminate;
    volatile long         active;
    
public:
    thread_pool(int n_pool_size = 5):
        terminate(0),active(0)

    void add_task(task *t)

    void start()
    void stop()
    {
       locked::set(terminate, 1);
       while(active > 0)
       {
         got_something.signal();
         yield();
       }
    }

protected:
    task* next_task();

    static DWORD WINAPI thread(LPVOID pParam)
    {
        thread_pool* pthis = static_cast<thread_pool*>(pParam);
        while(!pthis->terminate)
        {
            task *t = pthis->next_task();
            if(t)
            {
               t->exec();
               delete t;
            }
        }
        locked::dec(pthis->active);
        return 0;
    }
};

}
Re[21]: volatile у переменной класса
От: c-smile Канада http://terrainformatica.com
Дата: 20.01.05 20:31
Оценка:
Здравствуйте, achp, Вы писали:

A>Кстати, конкретный вопрос. Назовите тот библиотечный файл, в котором "сидит" тело функции WaitForSingleObject.


Для с++ "тело" этой функции сидит в

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.

Re[21]: volatile у переменной класса
От: c-smile Канада http://terrainformatica.com
Дата: 20.01.05 20:33
Оценка:
Здравствуйте, achp, Вы писали:

CS>>Как выглядит "барьер" в стандарте C++?


A>Барьер в стандарте Си/Си++ отсутствует. Отсюда следует, что единственный способ, которым он может быть выражен — вызов некоторой функции.


Что такое "некоторая функция"? Любая? Или какая?
Есть какое-нибудь строгое определение алгоритма определения барьера?
Re[11]: [2]: : volatile: а можно примеры?
От: MaximE Великобритания  
Дата: 20.01.05 21:13
Оценка:
c-smile wrote:

> Здравствуйте, eao197, Вы писали:

>
> E>А с этим я никогда и не спорил. Поэтому еще раз проясню свою позицию: я хочу увидеть реальные примеры (из реальных, а не тестовых примеров), когда использовались примитивы синхронизации, но приложение все равно работало не правильно до тех пор, пока не было использовано volatile. При этом меня не интересуют ни обработчики аппаратных прерываний, ни работа с железом через отображаемые в память порты ввода/вывода.
>
> E>Прошу не приводить примеров, когда компилятору специальными ключами явно указывали, что ни одна функция не имеет побочных эффектов. Применение такого ключа в многопоточной программе, ИМХО, является проявлением излишнего оптимизма программиста. Кроме того, такой пример я уже видел. Может есть что-то еще?

Во-первых, ты не привел кода, который мы просили привести: код, который использует ф-ции синхронизации для доступа к разделяемым переменным, но не работает когда эти разделяемые переменные не volatile.

> На моей задаче aliasing оптимизация дает 16% прирост производительности. Поэтому без этой оптимизации я даже и не компилирую.

> http://terrainformatica.com/htmlayout
>
> Вот фрагмент кода который без volatile просто не компилируется: например метод locked::dec(volatile long& cnt);

Вот тебе минимальный код, который вопреки твоим словам скомпилируется:

long l;
locked::dec(l);


> Использование критической секции вокруг mutex для проверки флагов active и terminate было протестировано и признано неоправданным — потеря производительности.

>
> Попытка использовать голые (не volatile) флаги вызывала очень странный behavior.

Почему не использовались InterlockedCompareExchangeRelease для чтения значений разделяемых переменных?

Если бы ты воспользовался этими ф-циями и заставил бы компилятор использовать intrinsic версии, твой код был бы не менее быстрым. InterlockedCompareExchangeRelease развернется на текущих Intel процессорах в LOCK CMPXCHG. Если destination в кэше процессора, то на современных процессорах Intel на шину не будет даже выставлен LOCK# сигнал.

Напротив же, ты воспользовался implementation defined семантикой volatile, сделав свой код гарантированно непереносимым на другие аппаратные платформы, поддерживаемые MS Windoze, компиляторы, а также следующие поколения процессоров Intel. Конечно, MS в лепешку разобъется, чтобы бинарники из кода такого качества работали на ее операционных системах и новейших процессорах Intel (при помощи MTRR), но в том режиме ты теряешь то, за что ты тут борешься — производительность.

На мой взгляд, этот очень типичный образчик multithreaded кода, написанного в заблуждениях относительно volatile: никакого прироста производительности от использования volatile вместо ф-ций синхронизации не достигнуто, лишь прибавилось потенциальных проблем.

> Вообще когда multithreading нечто начинает вести себя странно — ищи где ты забыл поставить volatile.


У меня есть чудесная мантра со 100% эффективностью от таких проблем:

Забудь про volatile, когда ты используешь multithreading.


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[12]: [2]: : volatile: а можно примеры?
От: c-smile Канада http://terrainformatica.com
Дата: 20.01.05 22:31
Оценка:
ME>Во-первых, ты не привел кода, который мы просили привести: код, который использует ф-ции синхронизации для доступа к разделяемым переменным, но не работает когда эти разделяемые переменные не volatile.

Просили привести реальный код где работают volatile. Я привел.
Абстрактные примеры тебе тоже привели.
Для любого разумного человека они убедительны. По идее.

>> На моей задаче aliasing оптимизация дает 16% прирост производительности. Поэтому без этой оптимизации я даже и не компилирую.

>> http://terrainformatica.com/htmlayout
>>
>> Вот фрагмент кода который без volatile просто не компилируется: например метод locked::dec(volatile long& cnt);

ME>Вот тебе минимальный код, который вопреки твоим словам скомпилируется:


ME>
ME>long l;
ME>locked::dec(l);
ME>


Нет, так как

struct locked
{
  static long dec(volatile long& v)
  {
    return InterlockedDecrement(&v);
  }
}


>> Использование критической секции вокруг mutex для проверки флагов active и terminate было протестировано и признано неоправданным — потеря производительности.

>>
>> Попытка использовать голые (не volatile) флаги вызывала очень странный behavior.

ME>Почему не использовались InterlockedCompareExchangeRelease для чтения значений разделяемых переменных?


А какая разница? Там их тоже volatile нужно обяъвлять

PVOID InterlockedCompareExchangePointer (
  PVOID volatile *Destination,  // destination address
  PVOID Exchange,               // exchange value
  PVOID Comperand               // value to compare
);


Я пишу реальные многоплатформенные конструкции.
Чем меньше внешних платформо зависимых функций тем мне легче.

volatile поддерживается и VC и GCC — т.е. это реальная платформонезависимость. Меня устраивает. И это работает.

ME>На мой взгляд, этот очень типичный образчик multithreaded кода, написанного в заблуждениях относительно volatile: никакого прироста производительности от использования volatile вместо ф-ций синхронизации не достигнуто, лишь прибавилось потенциальных проблем.


Знаешь, Макс, в моем багаже законченных продуктов
есть например специализированный FTP сервер который работает без перезагрузки машины
уже 14 месяцев с очень хорошим трафиком. Это я к тому что я примерно представляю как программировать multithreaded applications.

И кстати обрати внимание что тебе здесь оппонируют люди которые *реально* занимаются multithreading. emusic (респект) например.

>> Вообще когда multithreading нечто начинает вести себя странно — ищи где ты забыл поставить volatile.


ME>У меня есть чудесная мантра со 100% эффективностью от таких проблем:

ME>

ME>Забудь про volatile, когда ты используешь multithreading.


Я не говорю что без volatile нельзя написать multihreading код.
Я говорю — volatile есть, описан в стандарте языка, поддерживается нужными мне компиляторами и реально помогает мне писать эффективный код (простой, надежный, human readable).

Естесственно ты волен и вправе остваться при своем мнении. Только
вот эту вот максиму "Забудь про volatile, когда ты используешь multithreading" ты лучше не пой на интервью по С++.
Тебя сразу спросят про как вызвать тогда InterlockedIncrement и тебе нужно будет долго объяснять "что конкретно ты имеешь ввиду".

Вот например как реализуются barriers c помощью volatile переменных:

http://docs.hp.com/en/B3909-90003/apas04.html
Re[5]: ужас
От: Шахтер Интернет  
Дата: 21.01.05 01:43
Оценка:
Здравствуйте, achp, Вы писали:

A>Здравствуйте, Seriously Serious, Вы писали:


SS>>А если ВСЕ функции станут прозрачными и компилятор будет ВСЁ держать в регистрах?


A>Во-первых, из "прозрачности" ещё не следует, что можно "всё держать в регистрах". "Прозрачность", то есть доступность для компилятора тела данной функции, может позволить компилятору сделать вывод о том, какие объекты подвергаются модификации при её вызове, а какие — нет. А может и не позволить.


A>Во-вторых, тогда барьеры (и многопоточность вообще) станут просто невозможны.


Это почему ещё?
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[11]: volatile
От: emusic Франция https://software.muzychenko.net/ru
Дата: 21.01.05 03:34
Оценка: :)
Здравствуйте, emusic, Вы писали:

SS>>В таком случае, есть ли какое-нибудь полезное применение volatile на UDT? (в смысле, чтобы можно было только функции с volatile вызывать)


Вроде тут уже многократно обсудили, в чем состоит полезность и вредность volatile для любого типа Что осталось непонятым?
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[13]: [2]: : volatile: а можно примеры?
От: MaximE Великобритания  
Дата: 21.01.05 08:25
Оценка: 28 (5) +1 :)
c-smile wrote:

>

> ME>Во-первых, ты не привел кода, который мы просили привести: код, который использует ф-ции синхронизации для доступа к разделяемым переменным, но не работает когда эти разделяемые переменные не volatile.
>
> Просили привести реальный код где работают volatile. Я привел.

Вот что просили привести:

eao197 wrote:

> ... Поэтому еще раз проясню свою позицию: я хочу увидеть реальные примеры (из реальных, а не тестовых примеров), когда использовались примитивы синхронизации, но приложение все равно работало не правильно до тех пор, пока не было использовано volatile. При этом меня не интересуют ни обработчики аппаратных прерываний, ни работа с железом через отображаемые в память порты ввода/вывода.
>
> Прошу не приводить примеров, когда компилятору специальными ключами явно указывали, что ни одна функция не имеет побочных эффектов. Применение такого ключа в многопоточной программе, ИМХО, является проявлением излишнего оптимизма программиста. Кроме того, такой пример я уже видел. Может есть что-то еще?


Того что просили ты не привел.

>>> На моей задаче aliasing оптимизация дает 16% прирост производительности. Поэтому без этой оптимизации я даже и не компилирую.

>>> http://terrainformatica.com/htmlayout

Попытка использовать голые (не volatile) флаги вызывала очень странный behavior.
Вообще когда multithreading нечто начинает вести себя странно — ищи где ты забыл поставить volatile.


С этой опцией у тебя даже однопоточные программы будут глючить — поэтому тебе нужен volatile.

http://msdn.microsoft.com/library/en-us/vccore/html/_core_.2f.oa.2c_2f.ow.asp

Rules for Using /Oa and /Ow

  • If you use /Oa or /Ow, you must follow these rules. The following rules apply for any variable not declared as volatile:
  • No pointer can reference a variable that is used directly (a variable is referenced if it is on either side of an assignment or if a function uses it in an argument).
  • No variable can be used directly if a pointer to the variable is being used.
  • No variable can be used directly if its address is taken within a function.
  • No pointer can be used to access a memory location if another pointer modifies the same memory location.

    Failing to follow these rules can cause corrupted data. If variables seem to take on random values, compile the program with Disable (/Od). If the problem goes away, try compiling with optimization but without /Oa or /Ow.

    The following code can cause an aliasing problem:

    i = -100;
    while( i < 0 )
    {
         i += x + y;
         *p = i;
    }


    Without /Oa or /Ow, the compiler assumes that the assignment to *p can modify x or y, so it does not assume that x + y is constant for each iteration. If you specify /Oa or /Ow, the compiler assumes that modifying *p does not affect x or y and the calculation of x + y can be removed from the loop.


  • >>> Вот фрагмент кода который без volatile просто не компилируется: например метод locked::dec(volatile long& cnt);

    >
    > ME>Вот тебе минимальный код, который вопреки твоим словам скомпилируется:
    >
    > ME>
    > ME>long l;
    > ME>locked::dec(l);
    > ME>

    >
    > Нет, так как

    Что не так? Я тебе привел код, и он, вопреки твоим утвержедениям, компилируется.

    >
    > struct locked
    > {
    >   static long dec(volatile long& v)
    >   {
    >     return InterlockedDecrement(&v);
    >   }
    > }
    >


    И здесь без volatile прекрасно скомпилируется:
       static long dec(long& v)
       {
         return InterlockedDecrement(&v);
       }


    >>> Использование критической секции вокруг mutex для проверки флагов active и terminate было протестировано и признано неоправданным — потеря производительности.

    >>>
    >>> Попытка использовать голые (не volatile) флаги вызывала очень странный behavior.
    >
    > ME>Почему не использовались InterlockedCompareExchangeRelease для чтения значений разделяемых переменных?
    >
    > А какая разница? Там их тоже volatile нужно обяъвлять
    >
    >
    > PVOID InterlockedCompareExchangePointer (
    >   PVOID volatile *Destination,  // destination address
    >   PVOID Exchange,               // exchange value
    >   PVOID Comperand               // value to compare
    > );
    >

    >

    С какой это стати? По правилам языка С и C++ преобразование, которое "увеличивает" cv-квалификацию объекта, является неявным. Для обратного же преобразования нужен явный каст.

    Вот тебе примерчик:

    long l;
    long volatile* p1 = &l; // ok
    long const volatile* p2 = &l; // ok
    long* p3 = const_cast<long*>(p2); // cast required


    Thank you for testing your code with Comeau C/C++!
    Tell others about http://www.comeaucomputing.com/tryitout !
    
    Your Comeau C/C++ test results are as follows:
    
    Comeau C/C++ 4.3.3 (Aug  6 2003 15:13:37) for ONLINE_EVALUATION_BETA1
    Copyright 1988-2003 Comeau Computing.  All rights reserved.
    MODE:strict errors C++
    
    In strict mode, with -tused, Compile succeeded (but remember, the Comeau online compiler does not link).


    > Я пишу реальные многоплатформенные конструкции.

    > Чем меньше внешних платформо зависимых функций тем мне легче.
    >
    > volatile поддерживается и VC и GCC — т.е. это реальная платформонезависимость. Меня устраивает. И это работает.

    Ok, давай разбираться. Судя по типу HANDLE и макросу WINAPI, многоплатформенность в приведенном куске кода ограничивается платформой windoze. Допускаю, однако, что приведенный класс thread_pool используется в качестве (только) win32 pimpl (так как нет наследования от интерфейса) в платформенно-независимом классе thread_pool or whatever.

    Для платформы windoze у нас имеется следующая документация (подразумевается IA32):
    1. Compiler documentation. Visual Studio в своей док-ции документирует свое implementation defined поведение volatile:

      ... the system always reads the current value of a volatile object at the point it is requested...

      So far so good. Также там говорится, что

      The volatile keyword is a type qualifier used to declare that an object can be modified in the program by something such as the operating system, the hardware, or a concurrently executing thread.

      Слов required/mandatory или даже recommended/advised мы здесь не встречаем.
    2. Документация к API, в частности MSDN: DLLs, Processes, and Threads. Требования или даже рекоммендации использовать volatile shared variables мы здесь также не находим.
    3. Док-ция к процессору, здесь — IA-32 Intel® Architecture Software Developer's Manual Volume 3: System Programming Guide. Здесь нам черным по белому пишут в §7.2.4:

      It is recommended that software written to run on Pentium 4, Intel Xeon, and P6 family processors assume the processor-ordering model or a weaker memory-ordering model. The Pentium 4, Intel Xeon, and P6 family processors do not implement a strong memory-ordering model, except when using the UC memory type. Despite the fact that Pentium 4, Intel Xeon, and P6 family processors support processor ordering, Intel does not guarantee that future processors will support this model. To make software portable to future processors, it is recommended that operating systems provide critical region and resource control constructs and API s (application program interfaces) based on I/O, locking, and/or serializing instructions be used to synchronize access to shared areas of memory in multiple-processor systems. Also, software should not depend on processor ordering in situations where the system hardware does not support this memory-ordering model.


    На основе чего ты вывел, что твой volatile переносим и достаточен для обеспечения синхронизации при чтении разделяемой между потоками переменной? Так же, ты наплевал на предупреждения и рекоммендации Intel'a по написанию портабельного кода.

    > ME>На мой взгляд, этот очень типичный образчик multithreaded кода, написанного в заблуждениях относительно volatile: никакого прироста производительности от использования volatile вместо ф-ций синхронизации не достигнуто, лишь прибавилось потенциальных проблем.

    >
    > Знаешь, Макс, в моем багаже законченных продуктов

    Это уже не аргумент и оффтопик.

    > есть например специализированный FTP сервер который работает без перезагрузки машины

    > уже 14 месяцев с очень хорошим трафиком. Это я к тому что я примерно представляю как программировать multithreaded applications.

    Ok, давай меряться пиписьками. В моем багаже softswitch — VoIP сервер разруливающий пару тысяч соединений в секунду в real-time в одном единственном потоке (разбор ASN.1 BER запросов, обращения к базе oracle, etc..). Ты тут особо упираешь на производительность, но многопоточные приложения даже теоретически не могут обрабатывать больше соединений, чем однопоточные, хотя бы потому, что они привносят в приложения два из четырех основных performance killers: context switching и lock contention. Подробности: http://www.kegel.com/c10k.html , http://pl.atyp.us/content/tech/servers.html

    []

    >>> Вообще когда multithreading нечто начинает вести себя странно — ищи где ты забыл поставить volatile.

    >
    > ME>У меня есть чудесная мантра со 100% эффективностью от таких проблем:
    > ME>

    > ME>Забудь про volatile, когда ты используешь multithreading.
    > ME>

    >
    > Я не говорю что без volatile нельзя написать multihreading код.
    > Я говорю — volatile есть, описан в стандарте языка,

    Вот только эффекты от использования volatile are implementation defined. Стандарт здесь никаких гарантий не дает.

    > поддерживается нужными мне компиляторами и реально помогает мне писать эффективный код (простой, надежный, human readable).


    Но только не портабельный.

    > Естесственно ты волен и вправе остваться при своем мнении. Только

    > вот эту вот максиму "Забудь про volatile, когда ты используешь multithreading" ты лучше не пой на интервью по С++.
    > Тебя сразу спросят про как вызвать тогда InterlockedIncrement и тебе нужно будет долго объяснять "что конкретно ты имеешь ввиду".

    Да, на интервью надо всегда аккуратнее с глубокими познаниями, чтобы не напугать интервьюера

    > Вот например как реализуются barriers c помощью volatile переменных:

    >
    > http://docs.hp.com/en/B3909-90003/apas04.html

    В заголовке Using pthreads. Авторы стандарта pthreads (в частности, уже процитированный здесь David Butenhof) нам говорят, что для pthreads volatile избыточен. Либо тот кусок кода предназначен для компилятора, который не удовлетворяет требованиям pthreads, либо автор кода не был знаком со стандартом pthreads.

    --
    Maxim Yegorushkin
    Posted via RSDN NNTP Server 1.9
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.