|
|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Valentin Nechayev 2:5020/400 04 Feb 2004 17:45:11 To : Slawa Olhovchenkov Subject : Re: синхронизация. -------------------------------------------------------------------------------- >>> Slawa Olhovchenkov wrote: SO> Что-то я на ручник встал. SO> Есть программа, не тредовая. SO> Она крутится в цикле, формирует список. SO> По приходу сигнала -- что-то с этим списком делает. SO> А как бы сделать так, что бы себе на яйца не наступить? Или я губень SO> раскатал? Про sigprocmask тебе уже рассказали детально. Если список однонаправленный, то некоторые действия с ним (добавление в начало, например) можно делать на lock-free алгоритмах. Hапример: /* Добавление в голову */ do { Elem* currhead = head; newelem->next = currhead; } while( !atomic_compare_and_set( &head, newelem, currhead ) ); atomic_compare_and_set(a,b,c) действует так: если *a==c, то *a=b (присвоить) и вернуть 1, иначе вернуть 0. Внутри неё по сути одна команда CMPXCHG (для x86). В comp.programming.threads (или comp.unix.programmer?) был ~2 месяца назад длинный флейм про границы удобства и применимости lock-free алгоритмов. P.S. При реализации того, что "По приходу сигнала -- что-то с этим списком делает", надо тщательно проверить неиспользование async-signal-unsafe функций или же синхронное разрешение сигналов (тем же sigprocmask). Hесоблюдение этого - чревато боком. Яр Тихий делал FAQ по работе с сигналами, я его раз в пару месяцев засылаю в [fido7.]ru.unix.prog. Там всё это обсосано до косточек. Рекомендую, кстати, продолжить обсуждение именно там. -netch- --- ifmail v.2.15dev5.3 * Origin: Dark side of the coredump (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/10513727dccf3.html, оценка из 5, голосов 10
|