boost::thread
От: nervous Украина  
Дата: 19.06.04 18:41
Оценка:
Hi all.

Есть рабочий поток с вычислениями.
Есть модальное диалоговое окно для отображения прогресса.
Надо дать пользователю возможность прервать поток.
Как правильно это сделать?
Re: boost::thread
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 19.06.04 18:49
Оценка:
Здравствуйте, nervous, Вы писали:

N>Hi all.


N>Есть рабочий поток с вычислениями.

N>Есть модальное диалоговое окно для отображения прогресса.
N>Надо дать пользователю возможность прервать поток.
N>Как правильно это сделать?

Э-эх!.. Как оно там... Если вычисления в цикле (а так оно скорей всего и есть), то как-то так:

for(whatever)
{
    // Вычисления
    if(WAIT_OBJECT_0 == ::WaitForSingleObject(g_hStopCalculations, 0))
        return;
} // for
HgLab: Mercurial Server and Repository Management for Windows
Re: boost::thread
От: Azir Беларусь  
Дата: 19.06.04 22:31
Оценка: 1 (1)
Здравствуйте, nervous, Вы писали:

N>Hi all.


N>Есть рабочий поток с вычислениями.

N>Есть модальное диалоговое окно для отображения прогресса.
N>Надо дать пользователю возможность прервать поток.
N>Как правильно это сделать?

Можно, например, так:


#include <boost/thread/mutex.hpp>
#include <boost/thread.hpp>

void DoCalculations(int i);
void UpdateProgress(int i);
bool IsUserReadyToExit();

int const stepsNumber = 10;
boost::mutex monitor;
bool goingToExit = false;

void WorkThread()
{
    for (int i = 0; i < stepsNumber; ++i)
    {
        DoCalculations(i);
        {
            boost::mutex::scoped_lock lk(monitor);
            if (goingToExit)
                return;
        }
        UpdateProgress(i);
    }
}

int main()
{
    boost::thread workThread(WorkThread);
    while (!IsUserReadyToExit()) {}
    {
        boost::mutex::scoped_lock lk(monitor);
        goingToExit = true;
    }
    workThread.join();
}
Re: boost::thread
От: maq Россия http://www.maqdev.com
Дата: 20.06.04 13:29
Оценка: 2 (1)
Здравствуйте, nervous, Вы писали:

N>Hi all.


N>Есть рабочий поток с вычислениями.

N>Есть модальное диалоговое окно для отображения прогресса.
N>Надо дать пользователю возможность прервать поток.
N>Как правильно это сделать?


http://www.rsdn.ru/Forum/Message.aspx?mid=638858&amp;only=1
Автор: maq
Дата: 13.05.04
... << Rsdn@Home 1.1.4 beta 1 >>
Re[2]: boost::thread
От: Denwer Россия  
Дата: 21.06.04 06:19
Оценка:
Здравствуйте, Azir, Вы писали:

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


N>>Hi all.


N>>Есть рабочий поток с вычислениями.

N>>Есть модальное диалоговое окно для отображения прогресса.
N>>Надо дать пользователю возможность прервать поток.
N>>Как правильно это сделать?

A>Можно, например, так:



A>
A>#include <boost/thread/mutex.hpp>
A>#include <boost/thread.hpp>

A>void DoCalculations(int i);
A>void UpdateProgress(int i);
A>bool IsUserReadyToExit();

A>int const stepsNumber = 10;
A>boost::mutex monitor;
A>bool goingToExit = false;

A>void WorkThread()
A>{
A>    for (int i = 0; i < stepsNumber; ++i)
A>    {
A>        DoCalculations(i);
A>        {
A>            boost::mutex::scoped_lock lk(monitor);
A>            if (goingToExit)
A>                return;
A>        }
A>        UpdateProgress(i);
A>    }
A>}

A>int main()
A>{
A>    boost::thread workThread(WorkThread);
A>    while (!IsUserReadyToExit()) {}
A>    {
A>        boost::mutex::scoped_lock lk(monitor);
A>        goingToExit = true;
A>    }
A>    workThread.join();
A>}
A>


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

Не ужто нет переносимого решения для Intelocked функций?
Re[3]: boost::thread
От: Patalog Россия  
Дата: 21.06.04 08:11
Оценка:
Здравствуйте, Denwer, Вы писали:

хъ

D>Я конечно не знаю как там в юниксах это делается, может и так, но в виндах это слишком расточительно, обертывать одну переменную мьютексом.


Для виндов mutex::scoped_lock==CRITICAL_SECTION
Почетный кавалер ордена Совка.
Re[4]: boost::thread
От: Denwer Россия  
Дата: 21.06.04 08:33
Оценка:
Здравствуйте, Patalog, Вы писали:

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


P>хъ


D>>Я конечно не знаю как там в юниксах это делается, может и так, но в виндах это слишком расточительно, обертывать одну переменную мьютексом.


P>Для виндов mutex::scoped_lock==CRITICAL_SECTION


Это тоже расточительно по сравнения с интерлокед функциями.
Re[5]: boost::thread
От: _Winnie Россия C++.freerun
Дата: 21.06.04 08:49
Оценка:
Здравствуйте, Denwer, Вы писали:

D>Это тоже расточительно по сравнения с интерлокед функциями.


Не, не расточительно, в том случае, если переменную фактически использует только один поток и они не пытаются использовать ее одновременно. Тогда EnterCriticalSecton — просто десяток ассеблерных команд без всяких жутких усыплений.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[6]: boost::thread
От: Denwer Россия  
Дата: 21.06.04 08:54
Оценка:
Здравствуйте, _Winnie, Вы писали:

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


D>>Это тоже расточительно по сравнения с интерлокед функциями.


_W>Не, не расточительно, в том случае, если переменную фактически использует только один поток и они не пытаются использовать ее одновременно. Тогда EnterCriticalSecton — просто десяток ассеблерных команд без всяких жутких усыплений.


Круто круто, и зачем тогда вообще нужна критическая секция для одного потока.
Re[5]: boost::thread
От: Patalog Россия  
Дата: 21.06.04 09:21
Оценка:
Здравствуйте, Denwer, Вы писали:

[]

boost::detail::lightweight_mutex?
Почетный кавалер ордена Совка.
Re[2]: boost::thread - нафига он нужен ?...
От: Kalinsky V. http://www.promzona.design.ru
Дата: 21.06.04 09:43
Оценка:
Здравствуйте, Azir, Вы писали:

A>Можно, например, так:


A>[ccode]

A>#include <boost/thread/mutex.hpp>
A>#include <boost/thread.hpp>

A> DoCalculations(i);

A> {
A> boost::mutex::scoped_lock lk(monitor);
A> if (goingToExit)
A> return;
A> }
A> UpdateProgress(i);
A> }
A> boost::thread workThread(WorkThread);
A> while (!IsUserReadyToExit()) {}
A> {
A> boost::mutex::scoped_lock lk(monitor);
A> goingToExit = true;


Решил в отдельную тему вопрос не выводить (забьют минусами :) ). Смотрю на эту возню с бустом и не понимаю, зачем огород городить ? Почему не написать CreateThread(...., WorkThread, &dw) вместо boost::thread workThread(WorkThread) ? Чем лучше буст ? У меня одно объяснение: переносимость кода. Или я не прав ?
Цель деятельности всех программистов – чтобы их деятельность стала не нужна.
Re[6]: boost::thread
От: Denwer Россия  
Дата: 21.06.04 09:51
Оценка:
Здравствуйте, Patalog, Вы писали:

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


P>[]


P>boost::detail::lightweight_mutex?


Это тоже не то. Это реализация функционала мьютекса через интерлокед функции. Что совсем отличное от самих интерлокед функций.

ЗЫ: lightweight_mutex через интерлокед функции отстой

while( InterlockedExchange(&m_.l_, 1) )
{
 Sleep(1);
}


Этож надо было такое написать.
Неудосужилиись даже volatile поставить перед long l_;

Короче
Re[7]: boost::thread
От: Patalog Россия  
Дата: 21.06.04 10:21
Оценка:
Здравствуйте, Denwer, Вы писали:

хъ

D>Это тоже не то. Это реализация функционала мьютекса через интерлокед функции. Что совсем отличное от самих интерлокед функций.


А какое отношение это имеет к рассматриваемому вопросу?

D>
D>while( InterlockedExchange(&m_.l_, 1) )
D>{
D> Sleep(1);
D>}
D>


D>Этож надо было такое написать.


А что, собст. не так? Возврат значения InterlockedExchange нихрена не атомарно, в отличии от собственно Exchange.
Подход с циклом много где применяется, напр. Handy Features in Windows, and Interlocked Functions

D>Неудосужилиись даже volatile поставить перед long l_;


Хм, может конечно и надо бы поставить, но ведь оно по значению не меняется, а только по указателю...
Почетный кавалер ордена Совка.
Re[8]: boost::thread
От: Denwer Россия  
Дата: 21.06.04 10:32
Оценка:
Здравствуйте, Patalog, Вы писали:

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


P>хъ


D>>Это тоже не то. Это реализация функционала мьютекса через интерлокед функции. Что совсем отличное от самих интерлокед функций.


P>А какое отношение это имеет к рассматриваемому вопросу?


К первому посту никакого отношения не имеет, а дольше было предложено решение
boost::mutex::scoped_lock lk(monitor);
if (goingToExit)
    return;


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

D>>
D>>while( InterlockedExchange(&m_.l_, 1) )
D>>{
D>> Sleep(1);
D>>}
D>>


D>>Этож надо было такое написать.


P>А что, собст. не так? Возврат значения InterlockedExchange нихрена не атомарно, в отличии от собственно Exchange.

P>Подход с циклом много где применяется, напр. Handy Features in Windows, and Interlocked Functions

Это как так? Не понял?

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

D>>Неудосужилиись даже volatile поставить перед long l_;


P>Хм, может конечно и надо бы поставить, но ведь оно по значению не меняется, а только по указателю...
Re[9]: boost::thread
От: Patalog Россия  
Дата: 21.06.04 11:08
Оценка:
Здравствуйте, Denwer, Вы писали:

хъ

P>>А что, собст. не так? Возврат значения InterlockedExchange нихрена не атомарно, в отличии от собственно Exchange.

P>>Подход с циклом много где применяется, напр. Handy Features in Windows, and Interlocked Functions

D>Это как так? Не понял?


Имелось в виду то, что в
long ret = InterlockedExchange(&target, 1);

InterlockedExchange может вернуть 1. А нам нужен именно 0, чтобы быть уверенным, что никто другой не владеет мьютексом.

D>Может они и применяются, но у это явно не лучшее решение для быстрого мьютекса.


Критикуя — предлагай! Как бы ты реализовал lightweight_mutex?
Почетный кавалер ордена Совка.
Re[10]: boost::thread
От: Denwer Россия  
Дата: 21.06.04 11:50
Оценка:
Здравствуйте, Patalog, Вы писали:

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


P>хъ


P>>>А что, собст. не так? Возврат значения InterlockedExchange нихрена не атомарно, в отличии от собственно Exchange.

P>>>Подход с циклом много где применяется, напр. Handy Features in Windows, and Interlocked Functions

D>>Это как так? Не понял?


P>Имелось в виду то, что в

P>
P>long ret = InterlockedExchange(&target, 1);
P>

P>InterlockedExchange может вернуть 1. А нам нужен именно 0, чтобы быть уверенным, что никто другой не владеет мьютексом.

Кстати именно об этой проблеме писал насколько я помню Рихтер где то.

D>>Может они и применяются, но у это явно не лучшее решение для быстрого мьютекса.


P> Критикуя — предлагай! Как бы ты реализовал lightweight_mutex?


Решение одно, через критические секции.
Re: boost::thread
От: kzua  
Дата: 21.06.04 13:42
Оценка: -1
Здравствуйте, nervous, Вы писали:

N>Hi all.


N>Есть рабочий поток с вычислениями.

N>Есть модальное диалоговое окно для отображения прогресса.
N>Надо дать пользователю возможность прервать поток.
N>Как правильно это сделать?

Я смотрю тут у ребят мозги совсем затекли.
Вот самое простое, эффективное и верное решение.

BYTE nbDoCalc = 1;
HANDLE hThread; // = _beginthreadex
HWND hwndProgressBar;

void WorkThread()
{

while( nbDoCalc )
{
// Do Job
// SendMessage -> hwndProgressBar
...
};
};



MyDlgBox::OnStopCalc()
{
nbDoCalc = 1;

// ждем когда тред реально завершится
WaitForSingleObject( hThread, INFINITE );
};


Будет работать даже в многопроцессорном
окружении.


WBR, Alexei K.
Re[3]: boost::thread - нафига он нужен ?...
От: kzua  
Дата: 21.06.04 13:45
Оценка:
Здравствуйте, Kalinsky V., Вы писали:

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


A>>Можно, например, так:


A>>[ccode]

A>>#include <boost/thread/mutex.hpp>
A>>#include <boost/thread.hpp>

A>> DoCalculations(i);

A>> {
A>> boost::mutex::scoped_lock lk(monitor);
A>> if (goingToExit)
A>> return;
A>> }
A>> UpdateProgress(i);
A>> }
A>> boost::thread workThread(WorkThread);
A>> while (!IsUserReadyToExit()) {}
A>> {
A>> boost::mutex::scoped_lock lk(monitor);
A>> goingToExit = true;


KV>Решил в отдельную тему вопрос не выводить (забьют минусами ). Смотрю на эту возню с бустом и не понимаю, зачем огород городить ? Почему не написать CreateThread(...., WorkThread, &dw) вместо boost::thread workThread(WorkThread) ? Чем лучше буст ? У меня одно объяснение: переносимость кода. Или я не прав ?


Вот уж CreateThread действительно нельзя писать.

Только _beginthreadex !!!

WBR, Alexei K.
Re[2]: boost::thread
От: kzua  
Дата: 21.06.04 13:48
Оценка:
Здравствуйте, kzua, Вы писали:

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


N>>Hi all.


N>>Есть рабочий поток с вычислениями.

N>>Есть модальное диалоговое окно для отображения прогресса.
N>>Надо дать пользователю возможность прервать поток.
N>>Как правильно это сделать?

K>Я смотрю тут у ребят мозги совсем затекли.

K>Вот самое простое, эффективное и верное решение.

K>BYTE nbDoCalc = 1;

K>HANDLE hThread; // = _beginthreadex
K>HWND hwndProgressBar;

K>void WorkThread()

K>{

K> while( nbDoCalc )

K> {
K> // Do Job
K> // SendMessage -> hwndProgressBar
K> ...
K> };
K>};



K>MyDlgBox::OnStopCalc()

K>{
K> nbDoCalc = 1;
^^^^^^^^^^^^^
nbDoCalc = 0;

K> // ждем когда тред реально завершится

K> WaitForSingleObject( hThread, INFINITE );
K>};


K>Будет работать даже в многопроцессорном

K>окружении.


WBR, Alexei K.
Re[4]: boost::thread - нафига он нужен ?...
От: ssm Россия  
Дата: 21.06.04 13:48
Оценка:
Здравствуйте, kzua, Вы писали:

K>Вот уж CreateThread действительно нельзя писать.


K>Только _beginthreadex !!!


почему?
Re[5]: boost::thread - нафига он нужен ?...
От: kzua  
Дата: 21.06.04 14:19
Оценка: 10 (1)
Здравствуйте, ssm, Вы писали:

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


K>>Вот уж CreateThread действительно нельзя писать.


K>>Только _beginthreadex !!!


ssm>почему?


Library Support for Multithreading

Вообще-то:
Если тред использует только WIN32 API, и не
использует стандартные библиотеку C/C++, то
можно CreateThread.

Если используются стандартные библиотеки, то
нужно _beginthreadex.

Если используется MFC, то нужно AfxBeginThread
и нельзя _beginthreadex.

В общем об этом подробно написано в MSDN и
у Рихтера.


"Warning The multithread library LIBCMT.LIB includes the _beginthread and _endthread functions. The _beginthread function performs initialization without which many C run-time functions will fail. You must use _beginthread instead of CreateThread in C programs built with LIBCMT.LIB if you intend to call C run-time functions." (C) MSDN

WBR, Alexei K.
Re[2]: boost::thread
От: maq Россия http://www.maqdev.com
Дата: 21.06.04 14:36
Оценка:
А может вы внимательнее прочитаете сообщение?
Человек спрашивает как сделать это в boost::thread...
... << Rsdn@Home 1.1.4 beta 1 >>
Re[3]: boost::thread
От: kzua  
Дата: 21.06.04 15:24
Оценка:
Здравствуйте, maq, Вы писали:

maq>А может вы внимательнее прочитаете сообщение?

maq>Человек спрашивает как сделать это в boost::thread...

Гы гы гы...
А че не так-то?
Ну положим пусть thread создает не с помощью _beginthreadex,
а boost::thread.

Я подчеркиваю. Для синхронизации в данном конкретном случае
не нужно использвовать примитивы синхронизации из boost::thread.
Это по overhead. Достаточно использовать общую переменную
размерностью 1(!) BYTE(!).
При этом Вы не потеряете в нисколько в переносимости кода.

WBR, Alexei K.
Re[4]: boost::thread
От: maq Россия http://www.maqdev.com
Дата: 21.06.04 15:26
Оценка:
K>Я подчеркиваю. Для синхронизации в данном конкретном случае
K>не нужно использвовать примитивы синхронизации из boost::thread.
K>Это по overhead. Достаточно использовать общую переменную
K>размерностью 1(!) BYTE(!).
K>При этом Вы не потеряете в нисколько в переносимости кода.

K>WBR, Alexei K.


И даже не нужно объявлять ее как volatile?
... << Rsdn@Home 1.1.4 beta 1 >>
Re[5]: boost::thread
От: kzua  
Дата: 21.06.04 15:40
Оценка: :)
Здравствуйте, maq, Вы писали:

K>>Я подчеркиваю. Для синхронизации в данном конкретном случае

K>>не нужно использвовать примитивы синхронизации из boost::thread.
K>>Это по overhead. Достаточно использовать общую переменную
K>>размерностью 1(!) BYTE(!).
K>>При этом Вы не потеряете в нисколько в переносимости кода.

maq> И даже не нужно объявлять ее как volatile?


Ох блин. Нужно нужно
Для полной нирваны да. Черт вылетело из головы.

Хе хе. Совсем забыл этот прикол:
while( nbDoJob )
{
...
};

может превратиться в

MOV AL, nbDoJob
while( AL )
{

};

Дайте пилюли от склероза. Срочно.
WBR, Alexei K.
Re[4]: boost::thread
От: MaximE Великобритания  
Дата: 22.06.04 06:56
Оценка: -1
kzua wrote:

> Я подчеркиваю. Для синхронизации в данном конкретном случае

> не нужно использвовать примитивы синхронизации из boost::thread.
> Это по overhead. Достаточно использовать общую переменную
> размерностью 1(!) BYTE(!).
> При этом Вы не потеряете в нисколько в переносимости кода.

Потеряете. Без ассемблера не обойтись.

На x86 атомарность чтения байта, слова, двойнога слова гарантируется только на однопроцессорной машине. На многопроцессорной придется использовать префикс lock, чего без asm'a не сделать.

P.S. В этом случае volatile не нужен.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[5]: boost::thread
От: maq Россия http://www.maqdev.com
Дата: 22.06.04 07:46
Оценка:
ME>P.S. В этом случае volatile не нужен.

Почему?

ME>--

ME>Maxim Yegorushkin
... << Rsdn@Home 1.1.4 beta 1 >>
Re[6]: boost::thread
От: MaximE Великобритания  
Дата: 22.06.04 08:06
Оценка:
maq wrote:

> ME>P.S. В этом случае volatile не нужен.

>
> Почему?

Потому что volatile был придуман для регистров устройств и в C/C++ он не имеет никакого отношения к threading.

Подробности можешь разыскать на deja.com по ключевым словам "volatile terekhov".

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[7]: boost::thread
От: maq Россия http://www.maqdev.com
Дата: 22.06.04 08:39
Оценка:
>> ME>P.S. В этом случае volatile не нужен.
>> Почему?

ME>Потому что volatile был придуман для регистров устройств и в C/C++ он не имеет никакого отношения к threading.

ME>Подробности можешь разыскать на deja.com по ключевым словам "volatile terekhov".

Тогда получается что нет способа гарантированно читать переменную в которую могут писать несколько потоков,
даже если она защищена критичиской секцией?
... << Rsdn@Home 1.1.4 beta 1 >>
Re[7]: boost::thread
От: Denwer Россия  
Дата: 22.06.04 08:53
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>maq wrote:


>> ME>P.S. В этом случае volatile не нужен.

>>
>> Почему?

ME>Потому что volatile был придуман для регистров устройств и в C/C++ он не имеет никакого отношения к threading.


ME>Подробности можешь разыскать на deja.com по ключевым словам "volatile terekhov".


ME>--

ME>Maxim Yegorushkin

К треадингу он может и не имеет отношения, но вот это словцо говорит компилятору что бы он не сильно напрягал мозги по поводу оптимизации этой перменной. Или я не прав?
Re[5]: boost::thread
От: bw  
Дата: 22.06.04 08:58
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>kzua wrote:



ME>Потеряете. Без ассемблера не обойтись.


ME>На x86 атомарность чтения байта, слова, двойнога слова гарантируется только на однопроцессорной машине. На многопроцессорной придется использовать префикс lock, чего без asm'a не сделать.


ME>P.S. В этом случае volatile не нужен.


Выдержка из IA-32 Intel® Architecture Software Developer’s Manual

7.1.1. Guaranteed Atomic Operations
The Pentium 4, Intel Xeon, P6 family, Pentium, and Intel486 processors guarantee that the
following basic memory operations will always be carried out atomically:
• Reading or writing a byte.
• Reading or writing a word aligned on a 16-bit boundary.
• Reading or writing a doubleword aligned on a 32-bit boundary.
The Pentium 4, Intel Xeon, and P6 family, and Pentium processors guarantee that the following
additional memory operations will always be carried out atomically:
• Reading or writing a quadword aligned on a 64-bit boundary.
• 16-bit accesses to uncached memory locations that fit within a 32-bit data bus.
The P6 family processors guarantee that the following additional memory operation will always
be carried out atomically:
• Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a 32-byte cache
line.
Accesses to cacheable memory that are split across bus widths, cache lines, and page boundaries
are not guaranteed to be atomic by the Pentium 4, Intel Xeon, P6 family, Pentium, and Intel486
processors. The Pentium 4, Intel Xeon, and P6 family processors provide bus control signals that
permit external memory subsystems to make split accesses atomic; however, nonaligned data
accesses will seriously impact the performance of the processor and should be avoided.
Re[5]: boost::thread
От: Аноним  
Дата: 22.06.04 09:20
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>kzua wrote:


>> Я подчеркиваю. Для синхронизации в данном конкретном случае

>> не нужно использвовать примитивы синхронизации из boost::thread.
>> Это по overhead. Достаточно использовать общую переменную
>> размерностью 1(!) BYTE(!).
>> При этом Вы не потеряете в нисколько в переносимости кода.

ME>Потеряете. Без ассемблера не обойтись.


ME>На x86 атомарность чтения байта, слова, двойнога слова гарантируется только на однопроцессорной машине. На многопроцессорной придется использовать префикс lock, чего без asm'a не сделать.


ME>P.S. В этом случае volatile не нужен.


Ну откуда такие сведения? Или это твое IMHO?
Тут ты не прав. lock не нужен.
См. Manual на IA32, IA64.

Для 1 байта все в порядке.
lock нужен для переменных более 1го байта.
В случаях когда переменная не выровнена извлечение и запись
ее в ОП может происходить за несколько обращений к памяти.
Например: извлекли старший байт, затем извлекли младший байт.
поэтому чтобы никто из других процессоров не вклинился в
этот момент (к этому же участку памяти) используется блокировка шины на все время выполнения команды. lock.
lock ничего не делает кроме как монопольный захват шины на все время выполнения
команды (mov, inc и т.д.). Т.е. гарантирует атомарность.
Имея переменную размером 1 байт извлечение и запись ее будет производится атомарно.

Если какой-то CPU изменяет значение переменной, то он тут же скидывает ее в ОП
и сообщает остальным CPU об инвалидации данного участка памяти.
Поэтому они при следующем обращении возьмут значение переменной не из
cache, а из ОП.

Lock не запускает процедуру инвалидации. Lock лишь гарантирует атомарность!
Атомарность записи/чтения 1го байта гарантируется by design.
Так же гаранитруется атомарность записи/чтения выровненных переменных.
Все компиляторы генерят код с выравненными статическими переменными.
Поэтому приведенные код будет работать даже при WORD, DWORD разделяемой переменной.
new вроде тоже старается выдавать выравненные участки памяти
(хотя где гарантии?).

Наш пример самый элементарный: 1ый поток писатель, 2ой поток читатель.
Более элементарный пример придумать сложно (и есть ли вообще?).
Поэтому с 1 разделяемым байтом все будет в порядке.
Наворачивать сюда объекты синхронизации --- overhead.

WBR, Alexei K.
Re[6]: boost::thread
От: MaximE Великобритания  
Дата: 22.06.04 09:49
Оценка:
>>> Я подчеркиваю. Для синхронизации в данном конкретном случае
>>> не нужно использвовать примитивы синхронизации из boost::thread.
>>> Это по overhead. Достаточно использовать общую переменную
>>> размерностью 1(!) BYTE(!).
>>> При этом Вы не потеряете в нисколько в переносимости кода.
>
> ME>Потеряете. Без ассемблера не обойтись.
>
> ME>На x86 атомарность чтения байта, слова, двойнога слова гарантируется только на однопроцессорной машине. На многопроцессорной придется использовать префикс lock, чего без asm'a не сделать.
>
> ME>P.S. В этом случае volatile не нужен.
>
> Ну откуда такие сведения? Или это твое IMHO?
> Тут ты не прав. lock не нужен.
> См. Manual на IA32, IA64.

http://rsdn.ru/Forum/?mid=357586
Автор: MaximE
Дата: 19.08.03


Особенно последний абзац цитаты.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[6]: boost::thread
От: MaximE Великобритания  
Дата: 22.06.04 09:50
Оценка:
bw wrote:

> ME>P.S. В этом случае volatile не нужен.

>
> Выдержка из IA-32 Intel® Architecture Software Developer’s Manual

[]

К volatile это никакого отношения не имеет.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[8]: boost::thread
От: MaximE Великобритания  
Дата: 22.06.04 09:56
Оценка:
maq wrote:

>>> ME>P.S. В этом случае volatile не нужен.

>>> Почему?
>
> ME>Потому что volatile был придуман для регистров устройств и в C/C++ он не имеет никакого отношения к threading.
> ME>Подробности можешь разыскать на deja.com по ключевым словам "volatile terekhov".
>
> Тогда получается что нет способа гарантированно читать переменную в которую могут писать несколько потоков,
> даже если она защищена критичиской секцией?

Доступ к ф-циям примитивов синхронизации обычно является вызовом ф-ции, например EnterCriticalSection(). После вызова ф-ции компилятор не может делать никаких предположений о состоянии переменных, поэтому при следующем доступе переменная будет зачитана из памяти, независимо от volatile'ности. volatile ни достаточен, ни полезен.

Можно рассматривать volatile как антиоптимизацию в mutlithreaded programming. И как одно из самых распространенных заблуждений.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[9]: boost::thread
От: MaximE Великобритания  
Дата: 22.06.04 10:03
Оценка: 6 (1)
MaximE wrote:

разжевано &mdash; Re: Talking about volatile and threads synchronization...

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[5]: boost::thread
От: plads_project  
Дата: 22.06.04 10:17
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>На x86 атомарность чтения байта, слова, двойнога слова гарантируется только на однопроцессорной машине. На многопроцессорной придется использовать префикс lock, чего без asm'a не сделать.


Если ты под чтением и записью подразумевал команду mov, то гарантируется и на многопроцессорной тоже.
И вообще, lock перед mov дает при выполнении исключение invalid lock sequence.
Re[7]: boost::thread
От: Аноним  
Дата: 22.06.04 10:23
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>bw wrote:


>> ME>P.S. В этом случае volatile не нужен.

>>
>> Выдержка из IA-32 Intel® Architecture Software Developer’s Manual

ME>[]


ME>К volatile это никакого отношения не имеет.



Я прокомментировал заблуждение относительно атомарности.
volatile же к атомарности действительно никакого отношения не имеет.
Re[7]: boost::thread
От: Аноним  
Дата: 22.06.04 10:29
Оценка:
Здравствуйте, MaximE, Вы писали:

>>>> Я подчеркиваю. Для синхронизации в данном конкретном случае

>>>> не нужно использвовать примитивы синхронизации из boost::thread.
>>>> Это по overhead. Достаточно использовать общую переменную
>>>> размерностью 1(!) BYTE(!).
>>>> При этом Вы не потеряете в нисколько в переносимости кода.
>>
>> ME>Потеряете. Без ассемблера не обойтись.
>>
>> ME>На x86 атомарность чтения байта, слова, двойнога слова гарантируется только на однопроцессорной машине. На многопроцессорной придется использовать префикс lock, чего без asm'a не сделать.
>>
>> ME>P.S. В этом случае volatile не нужен.
>>
>> Ну откуда такие сведения? Или это твое IMHO?
>> Тут ты не прав. lock не нужен.
>> См. Manual на IA32, IA64.

ME>http://rsdn.ru/Forum/?mid=357586
Автор: MaximE
Дата: 19.08.03


ME>Особенно последний абзац цитаты.


Ну процитируй его сюда. Мне тупому.
Читаю и не нахожу грабель.

Пожалуйста, процитируй, что тебе не нравится,
а рядом тут же попытайся перевести.
Посмотрим ...


WBR, Alexei K.
Re[9]: boost::thread
От: Аноним  
Дата: 22.06.04 10:47
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>maq wrote:


>>>> ME>P.S. В этом случае volatile не нужен.

>>>> Почему?
>>
>> ME>Потому что volatile был придуман для регистров устройств и в C/C++ он не имеет никакого отношения к threading.
>> ME>Подробности можешь разыскать на deja.com по ключевым словам "volatile terekhov".
>>
>> Тогда получается что нет способа гарантированно читать переменную в которую могут писать несколько потоков,
>> даже если она защищена критичиской секцией?

ME>Доступ к ф-циям примитивов синхронизации обычно является вызовом ф-ции, например EnterCriticalSection(). После вызова ф-ции компилятор не может делать никаких предположений о состоянии переменных, поэтому при следующем доступе переменная будет зачитана из памяти, независимо от volatile'ности. volatile ни достаточен, ни полезен.


ME>Можно рассматривать volatile как антиоптимизацию в mutlithreaded programming. И как одно из самых распространенных заблуждений.


Если используются критические секции, то volatile не нужен.
Если же не используются, как в предлагаемом мной варианте,
то volatile в общем случае нужен.
Да и вообще какая в нашем случае к черту оптимизация возможна?
Вот уж если использовать критические секции вот это и есть
криворкость и антиоптимизация.

WBR, Alexei K.
Re[9]: boost::thread
От: maq Россия http://www.maqdev.com
Дата: 22.06.04 11:09
Оценка:
ME>Доступ к ф-циям примитивов синхронизации обычно является вызовом ф-ции, например EnterCriticalSection(). После вызова ф-ции компилятор не может делать никаких предположений о состоянии переменных, поэтому при следующем доступе переменная будет зачитана из памяти, независимо от volatile'ности. volatile ни достаточен, ни полезен.

Это понятно, компилятор ее перечитает. Но где гарантия того что она перечитается корректно в многопроцессорной
среде если ее до этого изменил другой процессор?
Ведь компилятор не вставит lock...
... << Rsdn@Home 1.1.4 beta 1 >>
Re[9]: boost::thread
От: Аноним  
Дата: 22.06.04 11:10
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>maq wrote:


>>>> ME>P.S. В этом случае volatile не нужен.

>>>> Почему?
>>
>> ME>Потому что volatile был придуман для регистров устройств и в C/C++ он не имеет никакого отношения к threading.
>> ME>Подробности можешь разыскать на deja.com по ключевым словам "volatile terekhov".
>>
>> Тогда получается что нет способа гарантированно читать переменную в которую могут писать несколько потоков,
>> даже если она защищена критичиской секцией?

ME>Доступ к ф-циям примитивов синхронизации обычно является вызовом ф-ции, например EnterCriticalSection(). После вызова ф-ции компилятор не может делать никаких предположений о состоянии переменных, поэтому при следующем доступе переменная будет зачитана из памяти, независимо от volatile'ности. volatile ни достаточен, ни полезен.


ME>Можно рассматривать volatile как антиоптимизацию в mutlithreaded programming. И как одно из самых распространенных заблуждений.



Опять чуть не забыл.

Стандарт C++. 1.9 Program execution

keywords: sequence points
side effects

Это к тому, что volatile нужен не часто.
Но в данном конкретном случае "кашу" он не испортит.

WBR, Alexei K.
Re[8]: boost::thread
От: MaximE Великобритания  
Дата: 22.06.04 11:21
Оценка:
>>> Ну откуда такие сведения? Или это твое IMHO?
>>> Тут ты не прав. lock не нужен.
>>> См. Manual на IA32, IA64.
>
> ME>http://rsdn.ru/Forum/?mid=357586
Автор: MaximE
Дата: 19.08.03

>
> ME>Особенно последний абзац цитаты.
>
> Ну процитируй его сюда. Мне тупому.
> Читаю и не нахожу грабель.
>
> Пожалуйста, процитируй, что тебе не нравится,

Accesses to cacheable memory that are split across bus widths, cache lines and page boundaries are not guaranteed to be atomic by the Pentium 4, Intel Xeon, P6 family, Pentium and Intel486 processors. The Pentium 4, Intel Xeon and P6 family processors provide bus control signals that permit external memory subsystems to make split accesses atomic; however, nonaligned data accesses will seriously impact the performance of the processor and should be avoided.


> а рядом тут же попытайся перевести.


...Accesses to cacheable memory that are split across bus widths, cache lines... — у каждого проца своя cache line

...bus control signals that permit external memory subsystems to make split accesses atomic... — это префикс lock

На десерт еще цитата.

>>> ME>P.S. В этом случае volatile не нужен.


...

On a multiprocessor (which C does not recognize), "sequence points" can only
be reasonably interpreted to refer to the view of memory from that
particular processor. (Otherwise the abstract model becomes too expensive
to be useful.) Therefore, volatile may say nothing at all about the
interaction between two threads running in parallel on a multiprocessor.


On a high-performance modern SMP system, memory transactions are effectively
pipelined. A memory barrier does not "flush to memory", but rather inserts
barriers against reordering of operations in the memory pipeline. For this
to have any meaning across processors there must be a critical sequence on
EACH end of a transaction that's protected by appropriate memory barriers.
This protocol has no possible meaning for an isolated volatile variable,
and therefore cannot be applied.


The protocol can only be employed to protect the relationship between two
items; e.g., "if I assert this flag then this data has been written" paired
with "if I can see the flag is asserted, then I know the data is valid".

That's how a mutex works. The mutex is a "flag" with builtin barriers
designed to enforce the visibility (and exclusion) contract with data
manipulations that occur while holding the mutex. Making the data volatile
contributes nothing to this protocol, but inhibits possibly valuable
compiler optimizations within the code that holds the mutex, reducing
program efficiency to no (positive) end.


If you have a way to generate inline barriers (or on a machine that doesn't
require barriers), and you wish to build your own low-level protocol that
doesn't rely on synchronization (e.g., a mutex), then your compiler might
require that you use volatile -- but this is unspecified by either ANSI C
or POSIX. (That is, ANSI C doesn't recognize parallelism and therefore
doesn't apply, while POSIX applies no specific additional semantics to
"volatile".) So IF you need volatile, your code is inherently nonportable.

A corollary is that if you wish to write portable code, you have no need for
volatile. (Or at least, if you think you do have a need, it won't help you
any.)


...


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[10]: boost::thread
От: maq Россия http://www.maqdev.com
Дата: 22.06.04 11:38
Оценка:
Сорри вопрос снимается, атомарность нам гарантирует критическая секция.
А переменная будет перечитываться из-за вызова функции.
... << Rsdn@Home 1.1.4 beta 1 >>
Re[6]: boost::thread
От: MaximE Великобритания  
Дата: 22.06.04 11:48
Оценка:
plads_project

> ME>На x86 атомарность чтения байта, слова, двойнога слова гарантируется только на однопроцессорной машине. На многопроцессорной придется использовать префикс lock, чего без asm'a не сделать.

>
> Если ты под чтением и записью подразумевал команду mov, то гарантируется и на многопроцессорной тоже.

На многопроцессорной не гарантируется. См. цитату из intel reference.

> И вообще, lock перед mov дает при выполнении исключение invalid lock sequence.


А где ты в обсуждении увидел mov?

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[8]: boost::thread
От: MaximE Великобритания  
Дата: 22.06.04 11:54
Оценка:
> Я прокомментировал заблуждение относительно атомарности.
> volatile же к атомарности действительно никакого отношения не имеет.

Over quoting — из того, что ты выше процитировал, трудно сделать вывод, что ты писал не про volatile.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[9]: boost::thread
От: Аноним  
Дата: 22.06.04 12:09
Оценка:
Здравствуйте, MaximE, Вы писали:

>>>> Ну откуда такие сведения? Или это твое IMHO?

>>>> Тут ты не прав. lock не нужен.
>>>> См. Manual на IA32, IA64.
>>
>> ME>http://rsdn.ru/Forum/?mid=357586
Автор: MaximE
Дата: 19.08.03

>>
>> ME>Особенно последний абзац цитаты.
>>
>> Ну процитируй его сюда. Мне тупому.
>> Читаю и не нахожу грабель.
>>
>> Пожалуйста, процитируй, что тебе не нравится,

ME>

ME>Accesses to cacheable memory that are split across bus widths, cache lines and page boundaries are not guaranteed to be atomic by the Pentium 4, Intel Xeon, P6 family, Pentium and Intel486 processors. The Pentium 4, Intel Xeon and P6 family processors provide bus control signals that permit external memory subsystems to make split accesses atomic; however, nonaligned data accesses will seriously impact the performance of the processor and should be avoided.


>> а рядом тут же попытайся перевести.


ME>...Accesses to cacheable memory that are split across bus widths, cache lines... — у каждого проца своя cache line


Во блин. Перевод. Литературный нафиг.
Здесь that are инициирует перечисления состоящее из 3х пунктов.


"Доступы к закешированной памяти, которая разделена(пересекает): ширину шины, строки кэша и границы страниц --- не является атомарным by ...".

Тепрь ответь? 1 байт может превысить разрядность шины, строк кэша, или
пересечь границы страниц?

ME>...bus control signals that permit external memory subsystems to make split accesses atomic... — это префикс lock


Ну, ты же в общем-то правильные выводы сделал.

to make split accesses atomic --- чтобы доступ к не выровненным данным сделать
атомарным.

Ты в принципе-то понимаешь или нет, что говорить вообще о том, что переменная
1 байт может быть выровнена или не выровнена бессмысленно?
1 байт не может пересечь ширину шины данных, строку кэша, границы страниц.

1 байт --- это наименьшая и неделимая единица адресация за всю историю x86.

[skipped...] Ну загрузил. Это я тебе переведу чуть по позже.
Пока времени особо нет. Да и вообще давай пока апеллировать к официальной
документации.


WBR Alexei K.
Re[7]: boost::thread
От: plads_project  
Дата: 22.06.04 12:12
Оценка:
>> ME>На x86 атомарность чтения байта, слова, двойнога слова гарантируется только на однопроцессорной машине. На многопроцессорной придется использовать префикс lock, чего без asm'a не сделать.
>>
>> Если ты под чтением и записью подразумевал команду mov, то гарантируется и на многопроцессорной тоже.

ME>На многопроцессорной не гарантируется.


И как же ты представляешь себе неатомарность в данном случае?

ME>См. цитату из intel reference.


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

>> И вообще, lock перед mov дает при выполнении исключение invalid lock sequence.


ME>А где ты в обсуждении увидел mov?


Вероятно, ты не заметил мои слова "Если ты под чтением и записью подразумевал команду mov"
Re[8]: boost::thread
От: plads_project  
Дата: 22.06.04 12:27
Оценка:
ME>>См. цитату из intel reference.

По поводу этой цитаты еще вот что могу добавить:

Accesses to cacheable memory that are split across bus widths

Как я понимаю, типичным Access такого рода является инструкция add [mem],...
Она должна сачала прочитать ячейку памяти, потом произвести сложение, а потом её записать. Между чтением и записью другой процессор действительно может что-то натворить .
Но вспомни с чего началась эта ветка. Человек предложил использовать переменную nbDoCalc. В том случае требуются только чтение и запись.
Re[9]: boost::thread
От: Аноним  
Дата: 22.06.04 12:33
Оценка:
Здравствуйте, plads_project, Вы писали:

ME>>>См. цитату из intel reference.


_>По поводу этой цитаты еще вот что могу добавить:

_>

_>Accesses to cacheable memory that are split across bus widths

_>Как я понимаю, типичным Access такого рода является инструкция add [mem],...
_>Она должна сачала прочитать ячейку памяти, потом произвести сложение, а потом её
записать. Между чтением и записью другой процессор действительно может что-то натворить .

Пожалуй твой перевод вернее.

_>Но вспомни с чего началась эта ветка. Человек предложил использовать переменную nbDoCalc. В том случае требуются только чтение и запись.


Будет все Ok. У нас 1 писатель и 1 читатель.


Даже если я заменю mov nbDoCalc,0 на
sub nbDoCalc, 1

Все равно будет все Ok без lock.

WBR, Alexei K.
Re[10]: boost::thread
От: MaximE Великобритания  
Дата: 22.06.04 12:36
Оценка: -1
> ME>...Accesses to cacheable memory that are split across bus widths, cache lines... — у каждого проца своя cache line
>
> Во блин. Перевод. Литературный нафиг.
> Здесь that are инициирует перечисления состоящее из 3х пунктов.
>
>
> "Доступы к закешированной памяти, которая разделена(пересекает): ширину шины, строки кэша и границы страниц --- не является атомарным by ...".
>
> Тепрь ответь? 1 байт может превысить разрядность шины, строк кэша, или
> пересечь границы страниц?

Ключевое место — split across ... cache lines. Т.е. один и тот же участок памяти или часть его находится в разных cache lines (даже не разных кэшах, что значит это относится и к одному процессору, о чем и сказано). byte по определенному адресу может легко находится в более чем одной cache line, dword может даже находится частично (скажем, low word) в одном cache line, частично (high word) в другом.

[]

> Ты в принципе-то понимаешь или нет, что говорить вообще о том, что переменная

> 1 байт может быть выровнена или не выровнена бессмысленно?
> 1 байт не может пересечь ширину шины данных, строку кэша, границы страниц.
>
> 1 байт --- это наименьшая и неделимая единица адресация за всю историю x86.

Я говорю не про байт, а про кэширование, см. выше.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[8]: boost::thread
От: MaximE Великобритания  
Дата: 22.06.04 12:42
Оценка:
plads_project wrote:

>>> ME>На x86 атомарность чтения байта, слова, двойнога слова гарантируется только на однопроцессорной машине. На многопроцессорной придется использовать префикс lock, чего без asm'a не сделать.

>>>
>>> Если ты под чтением и записью подразумевал команду mov, то гарантируется и на многопроцессорной тоже.
>
> ME>На многопроцессорной не гарантируется.
>
> И как же ты представляешь себе неатомарность в данном случае?

Я никак представляю, т.к. не являюсь специалистом по архитектуре процессоров intel вообще, и по их кэшам в частности. Я доверяю reference от intel.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[11]: boost::thread
От: kzua  
Дата: 22.06.04 13:25
Оценка:
Здравствуйте, MaximE, Вы писали:

>> ME>...Accesses to cacheable memory that are split across bus widths, cache lines... — у каждого проца своя cache line

>>
>> Во блин. Перевод. Литературный нафиг.
>> Здесь that are инициирует перечисления состоящее из 3х пунктов.
>>
>>
>> "Доступы к закешированной памяти, которая разделена(пересекает): ширину шины, строки кэша и границы страниц --- не является атомарным by ...".
>>
>> Тепрь ответь? 1 байт может превысить разрядность шины, строк кэша, или
>> пересечь границы страниц?

ME>Ключевое место — split across ... cache lines. Т.е. один и тот же участок памяти или часть его находится в разных ME>cache lines (даже не разных кэшах, что значит это относится и к одному процессору, о чем и сказано). byte по ME>определенному адресу может легко находится в более чем одной cache line, dword может даже находится частично

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
вот это опять твое IMHO.
ME>(скажем, low word) в одном cache line, частично (high word) в другом.

Я вообще перестаю тебя понимать.
Объясни мне как может часть 1 го байта "находиться в разных cache lines"?
Положим ты прав и дурной процессор заводит несколько копий одного и того
же байта в нескольких cache lines. Тут понимаешь начинаются такие проблемы
даже в однопоточных приложениях. Что ой мама.

Не надо додумывать ничего. В manuale все конкретно и понятно сказано.

Что ты понимаешь под атомарностью?

WBR, Alexei K.
Re[10]: boost::thread
От: plads_project  
Дата: 22.06.04 13:37
Оценка:
А>Все равно будет все Ok без lock.
Хотя я бы все-таки использовал какой-нибудь объект синхронизации
Re[11]: boost::thread
От: kzua  
Дата: 22.06.04 13:55
Оценка:
Здравствуйте, plads_project, Вы писали:

А>>Все равно будет все Ok без lock.

_>Хотя я бы все-таки использовал какой-нибудь объект синхронизации

А я и не настаиваю.
В конечно счете юзеру, наблюдающему progress bar
глубоко по барабану используете ли вы
объекты синхронизации, треды и другую хрень.

Делайте так как будет спокойнее Вам жить.

WBR, Alexei K.
Re[6]: boost::thread
От: MaximE Великобритания  
Дата: 23.06.04 08:09
Оценка:
>>> Я подчеркиваю. Для синхронизации в данном конкретном случае
>>> не нужно использвовать примитивы синхронизации из boost::thread.
>>> Это по overhead. Достаточно использовать общую переменную
>>> размерностью 1(!) BYTE(!).
>>> При этом Вы не потеряете в нисколько в переносимости кода.
>
> ME>Потеряете. Без ассемблера не обойтись.
>
> ME>На x86 атомарность чтения байта, слова, двойнога слова гарантируется только на однопроцессорной машине. На многопроцессорной придется использовать префикс lock, чего без asm'a не сделать.

> Ну откуда такие сведения? Или это твое IMHO?

> Тут ты не прав. lock не нужен.
> См. Manual на IA32, IA64.

Да, действительно я был не прав.

Чтение и запись байта, выровненных word, double word, quad word гарантировано атомарны. Атомарность операций read-modify-write, для которых и предназначен префикс lock, не гарантируется (есть исключения).

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[2]: boost::thread
От: Tom Россия http://www.RSDN.ru
Дата: 23.06.04 08:44
Оценка:
K>WBR, Alexei K.

ну тогда уже во первых
volatile BYTE nbDoCalc = 1;

а во вторых если уж используется буст и thread, то писать надо
мультиплатформный код....
... << RSDN@Home 1.1.0 stable >>
Народная мудрось
всем все никому ничего(с).
Re[3]: boost::thread
От: kzua  
Дата: 23.06.04 15:08
Оценка:
Здравствуйте, Tom, Вы писали:

K>>WBR, Alexei K.


Tom>ну тогда уже во первых

Tom>volatile BYTE nbDoCalc = 1;

Читай внимательно. Я еще позавчера 21.06.04 об этом
упоминал с подачи maq.

Tom>а во вторых если уж используется буст и thread, то писать надо

Tom>мультиплатформный код....

Интересно, а на какой платформе этот код не
будет работать и почему?
Сразу уточню: IA32, IA64 работает.

И вообще с логико-теоритической точки зрения
на этой платформе вообще возможно будет
писать мультитредовый код?

WBR, Alexei K.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.