One Writer Multireader

Тема в разделе "Общие вопросы по С и С++", создана пользователем Wert_Lex, 8 окт 2010.

  1. Wert_Lex

    Wert_Lex Гость

    Доброго времени суток, господа.
    Сразу к делу. Представим, что у нас есть переменная, скажем int i , десять потоков, которые могут прочитать ее значение и одиннадцатый, который может значение это изменить - пусть увеличить на единицу. Возникает логичный вопрос - что случится, когда выпадет момент и переменная будет одновременно читаться и писаться? Да, я знаком с мьютексами, семафорами, критическими секциями и двойной проверкой.
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Слабо верится
     
  3. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    В случае одной целой переменной - ничего не случится.
     
  4. Sekt

    Sekt Гость

    Доступ к одному ресурсу одновременно - DeadLock.
    P.s тут разные режимы Deadlock мало вероятен.оно может сначало прочесть а потом увеличить и наоборот
     
  5. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Sekt, что такое, по-вашему, deadlock, и от чего он происходит?
     
  6. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Wert_Lex
    В худшем случае - потоки прочитают неожиданное число. Но мне кажется что и этого не будет, хотя могу и ошибаться.
     
  7. Sekt

    Sekt Гость

    grigsoft,ожидание высвобождение общего ресурса 2-мя или более потоками.
     
  8. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Sekt, здесь не будет никакого ожидания. И ожидание - это просто ожидание, не deadlock. Оффтопик, но просто к сведению: deadlock - это ситуация с 2мя и более ресурсами А,Б, когда поток 1 владеет ресурсом А и ожидает освобождения ресурса Б, а поток 2 владеет ресурсом Б, и ожидает освобождения ресурса А. Вот в такой ситуации они действительно не могут дальше двигаться.
     
  9. Wert_Lex

    Wert_Lex Гость

    ниче вы тут нафлудили.
    Допустим имеется итератор, его точное значение не настолько важно. Что случится, если два потока попытаются _ОДНОВРЕМЕННО_ считать и записать итератор.

    European зачем мне нужны семафоры или критические секции, если писатель гарантировано один? Читать можно множественно одновременно.
     
  10. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    итератор чего?
     
  11. Wert_Lex

    Wert_Lex Гость

    Да пофигу чего итератор. Время пусть итератор считает. От начала эпохи динозавров. int типа пусть. не важно.
     
  12. alexsid

    alexsid Гость

    Для такой тупой задачи, когда 10 потоков просто читаю переменную, а один просто пишет нет никакой разницы.
    Просто, читающий поток может получить устаревшее значение. Это критично в некоторых алгоритмах...
    А вообще, одновременно прочитать и записать одну переменную аппаратура не позволяет. Данный конфликт будет разрешен в последовательность (чтение-запись или запись-чтение)
     
  13. Wert_Lex

    Wert_Lex Гость

    alexsid Спасибо, именно это и хотел услышать.
     
  14. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Ну уж если все так нужно отследить (конечно не для такого примера с переменной как автор описал), то использоват нужно только Мютекс и Симмафор. Мютекс на ограничение читающих процессов, а симмафор чисто на запись...
    Ну во всяком мне так кажется, тока примера что то использования найти не могу реального....
     
  15. Wert_Lex

    Wert_Lex Гость

    раз уж такое дело, то гораздо выгоднее использовать критические секции, если они в языке правильно реализованы. Или synchronized из java. Так-то.
     
Загрузка...

Поделиться этой страницей