Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> был ли флаг прочитан другим тредом до или после, его выставления? Только флаги! 
:(
    Опции темы
leniviy
Дата 17.9.2013, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



Меня это интересует с чисто образовательной точки зрения. Я знаю, как синхронизировать с помощью мьютексов или критических секций или функций Interlocked, а можно ли только флагами?

Код

volatile int TheFlag = 0, flag1 = 0, flag2 = 0, flag3 = 0;

// треды стартуют одновременно
void thread1() {
    int val;
    /* ... проверка флагов ... */
    TheFlag = 1;
    /* ... проверка флагов ... */
    val = ...
    printf("другой тред прочитал или прочитает значение: %d", val);
}

void thread2() {
    int val;
    flag1 = 1;
    val = TheFlag;
    if (val) flag2 = 1;
    flag3 = 1;
}




Это сообщение отредактировал(а) leniviy - 17.9.2013, 20:37
PM MAIL   Вверх
feodorv
Дата 17.9.2013, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(leniviy @  17.9.2013,  21:35 Найти цитируемый пост)
а можно ли только флагами?

Зависит от задачи, чаще всего (то есть даже почти всегда) - нет. Посмотрите на такую последовательность выполнения потоков:

Код

    if ( TheFlag ) flag2 = 1;


Код

     TheFlag = 1;
     // можем менять данные
     ....
     TheFlag = 0;
     // нельзя менять данные

  • первый поток проверяет значение флага TheFlag, которое на тот момент составляло 1
  • второй поток тут же устанавливает TheFlag в 0 (запрещая изменение данных)
  • первый поток считает, что он может менять данные, и меняет flag2 в 1 (и это тогда, когда TheFlag уже 0)



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
mes
Дата 17.9.2013, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



так ?:
Код

void thread_1()
{
   while (active_thread<>1) sleep(1);   

   do_some_1();
   active_thread = 2;  
}

void thread_1()
{
   while (active_thread<>2) sleep(1);
  
   do_some_2();
   active_thread = 1;
}


Это сообщение отредактировал(а) mes - 17.9.2013, 22:18


--------------------
PM MAIL WWW   Вверх
feodorv
Дата 17.9.2013, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(mes @  17.9.2013,  23:06 Найти цитируемый пост)
так ?

А вот спин-блокировка подойдёт  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
azesmcar
Дата 24.9.2013, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



mes подался в SQL? smile 

В дополнение
http://en.wikipedia.org/wiki/Peterson's_algorithm 
http://en.wikipedia.org/wiki/Dekker%27s_algorithm

Это сообщение отредактировал(а) azesmcar - 24.9.2013, 18:20
PM   Вверх
leniviy
Дата 24.9.2013, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



Цитата(azesmcar @  24.9.2013,  18:02 Найти цитируемый пост)
mes подался в SQL?

Не вижу ничего SQL-ного в коде mes'а.


Цитата(feodorv @  17.9.2013,  22:30 Найти цитируемый пост)
А вот спин-блокировка подойдёт  smile  


Я понял, что вместо того, чтобы ждать, пока другой тред освободит ресурс, надо дать другому треду сделать мою работу.
PM MAIL   Вверх
azesmcar
Дата 24.9.2013, 18:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(leniviy @  24.9.2013,  18:57 Найти цитируемый пост)
Не вижу ничего SQL-ного в коде mes'а.


Цитата(mes @  17.9.2013,  22:06 Найти цитируемый пост)
active_thread<>1


PM   Вверх
volatile
Дата 25.9.2013, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(azesmcar @  24.9.2013,  18:57 Найти цитируемый пост)
active_thread<>1

тяжелое наследие паскакализма, имхо.

PM MAIL   Вверх
vinter
Дата 25.9.2013, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Так, как написано в оригинально посте нельзя. volatile не имеет ничего общего ни с синхронизацией, ни с атомарностью. Флаг должен быть типа std::atomic или чего-то похожего за неимением оного.
А дальше всё зависит от целей: надо подождать, пока флаг будет выставлен? Надо использовать метод, который предложил mes, но я бы sleep убрал. В остальных случаях нет смысла в спине.




--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 25.9.2013, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  24.9.2013,  23:51 Найти цитируемый пост)
тяжелое наследие паскакализма, имхо.


давно на c++ не писал )) когда писал почуствовал, что выглядит не естесствено, но не стал вспоминать, как оно должно быть...  

паскаль не причем...

Добавлено через 2 минуты и 9 секунд
 smile 
azesmcar, 
vinter,  

с возвращением  smile 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0565 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.