Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Threads  (Прочитано 14759 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 27-05-2004 11:14 » 

Gospoda,

odin wopros - rech idet o sinhronizazii raboti s fajlom iz raznih potokow (to bish raznie uzeri pitajutsja im odnowremenno wospolzowatjsja w tot moment, kogda sistema startuet dlja nih moju programmku).
Tak wot ja snachala sdelala eto wse tak (uproshenno) :
Код:
// *********************** Lin *******************************

    key_t   key;
    int     semset_id, nSemNumber = 0, semval;
    struct  sembuf sem_lock = { 0, -1, SEM_UNDO};
    struct  sembuf sem_unlock = { 0, 1, SEM_UNDO};
    short   bIsSemapExists = 0;


    // create a Key for the Semaphore
    key = ftok(pStrSettinsFile, 5); 

    // check if exists.
    semset_id = semget(key, nSemNumber + 1, IPC_CREAT|IPC_EXCL|0666); 
    if(semset_id == -1)
    {
        // set a flag
        bIsSemapExists = 1;
        // get handle of semaphore
        semset_id = semget(key, nSemNumber + 1, IPC_CREAT|0666); 
    }

    if (bIsSemapExists == 0)
    {
        // set a start value
        semval = semctl(semset_id, nSemNumber, SETVAL, 1);
    }
   
    // lock a Semaphore
    if((semop(semset_id, &sem_lock, 1)) != -1)
    {
       // set a  Flag to 1 - Semaphore ist locked
        m_IsLocked = 1;

        // call a function

        // free Semaphore
        semop(semset_id, &sem_unlock, 1));
    }

    // get an actual value
    semval = semctl(semset_id, nSemNumber, GETVAL, 0);   
    if (semval == 1)
    {
        // delete
        semctl(semset_id, nSemNumber, IPC_RMID, 0);
        // set a start value
        semset_id = -1;
    }




// *********************** win *******************************


    DWORD   nResOfWait = 0;
    HANDLE  hMutex =  0;
    int     bIsOk = 1;

    // create / open
    hMutex =  CreateMutex(NULL, FALSE, "CheckLicenseMutex");
    if(GetLastError() == ERROR_ALREADY_EXISTS)
        // trace

    // check for valid
    if(hMutex == 0)
        return 0;

    // wait
    nResOfWait = WaitForSingleObject(hMutex, INFINITE);
    switch(nResOfWait)
    {
        case WAIT_ABANDONED:
        case WAIT_TIMEOUT:
            break;

        case WAIT_OBJECT_0:

            if (nCase == 1)
                // call a function
            break;

        default :
            break;
    }

    if(hMutex)
    {
        // free mutex
        bIsOk = ReleaseMutex(m_hMutex);
        if (bIsOk == 0)
        {
                //FormatMessage( ........
        }
        bIsOk = CloseHandle(m_hMutex);
        if (bIsOk == 0)
        {
            //FormatMessage( ....
        }
        // set to start value
        m_hMutex = 0;
    }

A teper ja wdrug zadumalas nad tem, chto wed eto moget bit i newerno Я шокирован!  Moget, w winde nado bilo cherez CriticalSection delat???
Ja, chestno goworja, ne do konza ponimaju raznizu w oboih podhodah - smisl wed wse rawno odin (blokiruem dostup w sluchae zanjatosti resursa).
Objasnite, esli mogete - ja na forumah iskala, no nichego na etu temu ne nashla.

Zaranee wsem spasibo!
« Последнее редактирование: 25-11-2007 22:02 от Алексей1153++ » Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 27-05-2004 17:52 » 

Malaja, речь, все таки, о потоках или о процессах? При словах "разные пользователи" становится ясно что о процессах.

В Linux-е лучше пользоваться flock() - это удобнее и надежнее, чем семафоры SysV. Например, если программа заблокирует семафор и затем сбойнет, то семафор останется заблокированным. Файловые блокировки при завершении процесса снимаются автоматически.

Советов для Win дать не могу, кроме одного - CriticalSection лучьше не пользоваться. В случае сбоя внутри этой секции, это еще опаснее, чем семафоры в Linux-е.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 28-05-2004 07:22 » 

RXL,

perwoe - spasibo za otwet, wtorore - izwini, ja opisalas, rech idet o prozessah.
Mogno ehse wopros (on tochno iz serii tupih, no ja ne spez w linuxe, prosto pisat prishlos  :oops: ) :  
Krome flock() est eshe i fcntl(). Naskolko ja ponjala iz helpa, oni obe blokirujut faili. W chem ge togda ih razlichie? Plus eshe odno - mne nugen mehanizm, kotorij rabotal bi na wseh mashinah tipa linux/ unix. posemu sootwetstwenno wopros - rabotaet li flock() wsjudu?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 28-05-2004 08:10 » 

Malaja, fcntl() - это управление фичами файлового дескриптора. В том числе, можно и блокировками управлять.

Вот описаны варианты блокировок по POSIX:
http://www.opengroup.org/onlinepubs/009695399/functions/fcntl.html
http://www.opengroup.org/onlinepubs/009695399/functions/flockfile.html
http://www.opengroup.org/onlinepubs/009695399/functions/lockf.html

flock() там не описан - видимо в стандарт не входит. Как сказано в мануале, появился flock() в 4.2BSD. Кроме того, его поведение будет зависить от реализации.

Видимо, лучше будет fcntl() использовать.

The Open Group Base Specifications Issue 6
IEEE Std 1003.1, 2004 Edition
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #4 : 28-05-2004 08:21 » 

Ponjatno, spasibo.
Tut, prawda, teper nowoe weselje (uge w drugom proekte - ne dalee, kak sejchas na stol pologili, izwergi   Ха-ха-ха ) - teper mne nado budet blokirowat zeluju seriju operazij, t.k. delo idet o lizensijah, t.e. user pitaetsja chto-to sdelat, a ego snachala prowerjajut i lish potom puskajut dalshe. Mne pridetsja shitiwat dannie iz fajla, analizirowat ih i zatem pri neobhodimosti izmenjat. W etom sluchae blokirowka fajlow, naskolko ja ponimaju, mne nichego uge ne dast, teper mne, widimo, nado budet taki semaforchikami polzowatjsja... Edinstwennoe, chto ja mogu w etom sluchae sdelat - pri ocherednom starte programmi prowerjat etot semafor na blokirowku i w sluchae ee nalichija ee prosto snimat.
Esli ti znaesh drugoj sposob, podskagi, pogalujsta.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 28-05-2004 08:27 » 

Malaja, опиши порядок действий. Если не трудно, опиши для чего делает программа. Надо понять, какие советы давать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #6 : 28-05-2004 08:42 » 

Situazija sledujushaja : user hochet wipolnit kakie-to dejstwija i posilaet zapros, popadajushij w moji programmu. Ja snachala dolgna prowerit sostojanie lizenzij (t.e. est li etot user w faile, esli da - izmenit wremja poslednego loga na segodnjashnjuju datu i dalee wipolnit ego zapros, esli net - prowerit, est li eshe swobodnie lizensii, esli da - wnesti etogo usera w fail, esli net - widat sootwetstwujushee soobshenie i prerwat wipolnenie zaprosa). prinzip takow - est fail, w kotorom stoit info o kolichestwe lizensij i t.d. w zashifrowannom wide, est fail, w kotorom stojat useri, zahodiwshie w sistemu (toge w zashifrowannom wide). T e. mne nado otkriwat eti faili, shitiwat iz nih sodergimoe, analizirowat i pri neobhodimosti izmenjat.
Wsju etu erundu ja sdelaju, kak .dll dlja winda ili .so dlja lin. posemu mne nado budet linkowat etu lib, blokirowat dostup dlja drugih prozessow i wiziwat sootwetstwujushuju funkziju. pri wozwrate iz nee opjat wse razblokirowat.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 28-05-2004 08:54 » new

Блокировки файлов тут в самый раз: открыть, заблокировать, прочесть, изменить, разблокировать, закрыть.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #8 : 28-05-2004 09:04 » 

Ti ponimaesh, ih ge neskolko, t.e. eto nado delat s akgdim i pri kagdom dostupe, posemu ja dumaju, chto eto bilo bi ochen gromozdko i imenno poetomu dumala blokirowat wes blok. K tomu ge esli ja shitaji info, zakroju fail, u menja ostaetsja staraja informazija, a w etot moment prihodit eshe odin prozess i chto-to menjaet! Naprimer, w realnosti, wse lizensii uge isherpani, a u menja eshe dlja perwogo prozessa ostalas neprawilnaj informazija! a tak - poka s odnim ne zakonchu - drugoj nichego ne smoget sdelat.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 28-05-2004 09:32 » 

Malaja, можно блокировать один файл. Все программы, работающие с этими файлами, должны будут вначале заблокировать один и тот же файл, а потом читать-писать в этот и остальные. Блокировку нельзя снимать до изменения файла. С семафором то же самое будет - пока блокирован, никто не читает, а как снимешь блокировку, то за содержимое файла уже не отвечаешь.

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

Дома у меня валяется прекрасная книжка тов. Стивенсона - посмотрю что он рекомендует.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #10 : 28-05-2004 10:28 » 

Spasibo za objasnenie!
No u menja woznikaet tut chisto prakticheskij wopros w swjazi s otsutstwiem nugnih dlja etogo znanij :
esli ja prawilno ponjala, porjadok dejstwij pri lock sledujushij :

open file
lock file
     // our job
unlock file
close file

1)wo-perwih, werno li eto?

2)zatem, mogu li ja delat tak :

open file
lock file
     // our job
close file
     // our job

open file
     // our job

unlock file
close file

3) poka ja iskala doc dlja etih funkzij , natknulas na sowet ispolzowat s nimi funkziju fflush, no w kakoj posledowatelnosti eshe i ee, rodimuju, mne sowsem ne jasno. i woobshe, nugna li ona?

4) ti upomjanul knigku Стивенсона - kak ona naziwaetsja? (esli mogno - russkij i anglijskij variant, chtobi mogno bilo w inete poiskat, moget ona gde-to dlja skachiwanija legit, t.k. esli ne najdu, budu tut w magazinah iskat, a tut knig na nashem iskonnom net, a iz rossii zakaziwat ochen slogno)
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 28-05-2004 11:09 » 

При закрытии файла блокировки снимаются автоматически, т.к. они существуют только в ядре, привязаны к структуре, описывающей открытый файл, и не имеют ни какого отношения к реальной файловой системе.
Если ты попытаешься разблокировать незаблокированный файл, то, я думаю, ничего страшного не произойдет - или OK, или ошибка. Лучше, конечно, в доке посмотреть.

Я напутал - не Стивенсон, а Стивенс (W. Richard Stevens). Книг по unix у него много и они очень детальные.
Вот эта книга.
yandex

fflush() - сбрасывает данные из буферов ядра на физический носитель. Если файл на твоем локальном диске, то это не обязательно - ядро само разрулит. Но, если сомневаешься, или файл лежит на другой машине, то используй. Например: после записи блока данных в файл, выполни fflush().
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Anonymous
Гость
« Ответ #12 : 28-05-2004 14:44 » 

Spasibo za informaziju!    Отлично
pora uchit linux  Так больше нельзя...  wind wse-taki prijatnee, ne goworja uge o wozmognosti debuga.

teper nado smotret - wse zawisit ot togo, kakowa posledowatelnost dejstwij, togda budet jasno, chto delat.

Odno galko - ja poka ne nashla stranichki, s kotoroj mogno bilo bi skachat knigku, nado budet eshe poiskat.    Я шокирован!
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #13 : 28-05-2004 14:46 » 

oj, eto ja sluchajno ne uwidela, chto menja uge otmeldowali, izwinjajus! :oops:
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #14 : 28-05-2004 15:24 » 

tak, tut stalo eshe weselee - teper rech idet uge o parallelnih potokah...
Ja luch'she nowuju temu otkroj, chtobi wse w odnu kuchu ne meshat
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines