Тема: N потоков на одну функцию... йо-хо-хо, и бутылка рому :)

Ответить в теме
Показано с 1 по 14 из 14
  1. Вверх #1

    По умолчанию N потоков на одну функцию... йо-хо-хо, и бутылка рому :)

    Вопрос: например, надо, чтобы Нное кол-во потоков периодически обращались к некоторой функции. Например, считывать новое задание.
    Главное - чтобы несколько потоков не получили одно и то же. Я так подумал - наверное, можно реализовать так:

    Код:
    //global
    int busy;
    int f(char* str/*скажем; туда будем помещать задание*/)
    {
    if (busy == 1) return false;
    
    busy = 1;
    {
    /*извлекание следующего задания*/
    }
    busy = 0;
    }
    Может, у кого-то есть замечания или лучшие предложения?
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]


  2. Вверх #2
    Посетитель
    Пол
    Мужской
    Адрес
    Odessa
    Сообщений
    491
    Репутация
    13
    Замечание: при такой организации - стабильности не будет. Потому что операция:
    Код:
      if (busy == 1) return false; 
      busy = 1;
    должна выполнятся атомарно.
    В твоем же случае поток при выполнении busy=1 может быть прерван так и не "доприсвоив" 1, а в это время второй поток запросто пройдет проверку if (busy==1) и в результате будешь иметь несколько потоков разоряющихся над одним заданием. Само собой, чем больше будет потоков, тем веселее будет "совместная" работа.

    Предложение: почитать про критические секции, семафоры и прочие стандартные средства синхронизации.
    Думаешь ли ты о жизни? Думаешь ли ты о смерти? Что ты будешь делать когда поймешь что никому не нужен?

  3. Вверх #3
    Ну, да.
    А как-то проще атомарность не достигается?
    Ну ладно, спасибо, пойду почитать.
    Спасибо.
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]

  4. Вверх #4
    Постоялец форума Аватар для Яр
    Пол
    Мужской
    Адрес
    Odessa.Ua
    Возраст
    37
    Сообщений
    2,915
    Репутация
    168
    Есть такие алгоритмы Деккера и Петерсона. Проблема состоит в том, чтобы обеспечить взаимоисключения. Тоесть, чтобы один из процессов вращался в цикле ожидания, пока другой выполняет критические инструкции..

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

    зы: вот только одно мне не понятно... если в алгоритме Петерсона в процессе, который находится в критическом разделе произойдёт сбой, то другой останется навсегда заблокированным? :) Вроде такого происходить не должно..
    ~ Motivation is what gets you started. Habit is what keeps you going.

  5. Вверх #5
    Посетитель
    Пол
    Мужской
    Адрес
    Odessa
    Сообщений
    491
    Репутация
    13
    Зависит от конкретной реализации и обговореных действиях, выполняемых при обнаружении сбоя.
    Думаешь ли ты о жизни? Думаешь ли ты о смерти? Что ты будешь делать когда поймешь что никому не нужен?

  6. Вверх #6
    Почитал про юниксовые треды.
    Можно ли сделать так: первый поток, добравшийся до функции, блочит спец. функцией все остальные (их немного) пока выполняются критические действия. Потом - разблочивает. Вроде должно работать...
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]

  7. Вверх #7
    Посетитель
    Пол
    Мужской
    Адрес
    Odessa
    Сообщений
    491
    Репутация
    13
    Ну а что по твоему критические секции делают? Блочат.. хех.. И разблочивают.
    Думаешь ли ты о жизни? Думаешь ли ты о смерти? Что ты будешь делать когда поймешь что никому не нужен?

  8. Вверх #8
    Ээ... я вообще не в курсе, что это за зверь такой - критические секции. Может, просветишь?
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]

  9. Вверх #9
    Постоялец форума Аватар для Яр
    Пол
    Мужской
    Адрес
    Odessa.Ua
    Возраст
    37
    Сообщений
    2,915
    Репутация
    168
    Критичиский раздел - В асинхронной процедуре компьютерной программы - часть, которая не может выполняться одновременно со связанным критическим разделом другой асинхронной процедуры. (Вильям Столлингс)
    :)
    ~ Motivation is what gets you started. Habit is what keeps you going.

  10. Вверх #10
    То есть, вещь абсолютно абстрактная?
    Иль есть фишка навроде
    Код:
    critical void* fubc(void*) {/**/}
    шучу, конечно не козлить.
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]

  11. Вверх #11
    Постоялец форума Аватар для Яр
    Пол
    Мужской
    Адрес
    Odessa.Ua
    Возраст
    37
    Сообщений
    2,915
    Репутация
    168
    Насколько я понимаю, да, тобишь абстрактная :)
    ~ Motivation is what gets you started. Habit is what keeps you going.

  12. Вверх #12
    Посетитель
    Пол
    Мужской
    Адрес
    Odessa
    Сообщений
    491
    Репутация
    13
    Но есть и конкретные реализации.

    krieger, не зли меня Иди читай, пока тебя не вздернули на рее Йо-хо-хо
    Думаешь ли ты о жизни? Думаешь ли ты о смерти? Что ты будешь делать когда поймешь что никому не нужен?

  13. Вверх #13
    Всё, ша! Уже и пошутить в родном городе нельзя!
    ЗЫ Злой ты какой-то, Слав... Вот что делает с людьми власть
    ЗЗЫ "Базар", я надеюсь, закончен. Вопрос уяснён, всем спасибо за винимание.
    EOF
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]

  14. Вверх #14
    Посетитель
    Пол
    Мужской
    Адрес
    Odessa
    Сообщений
    491
    Репутация
    13
    Я не злой. Просто ты еще ленивей меня. А это уже порок.
    Думаешь ли ты о жизни? Думаешь ли ты о смерти? Что ты будешь делать когда поймешь что никому не нужен?


Ответить в теме

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения