Malaja
|
|
« : 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
|
|
« Ответ #1 : 27-05-2004 17:52 » |
|
Malaja, речь, все таки, о потоках или о процессах? При словах "разные пользователи" становится ясно что о процессах.
В Linux-е лучше пользоваться flock() - это удобнее и надежнее, чем семафоры SysV. Например, если программа заблокирует семафор и затем сбойнет, то семафор останется заблокированным. Файловые блокировки при завершении процесса снимаются автоматически.
Советов для Win дать не могу, кроме одного - CriticalSection лучьше не пользоваться. В случае сбоя внутри этой секции, это еще опаснее, чем семафоры в Linux-е.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Malaja
|
|
« Ответ #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?
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
|
Malaja
|
|
« Ответ #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
|
|
« Ответ #5 : 28-05-2004 08:27 » |
|
Malaja, опиши порядок действий. Если не трудно, опиши для чего делает программа. Надо понять, какие советы давать.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Malaja
|
|
« Ответ #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
|
|
« Ответ #7 : 28-05-2004 08:54 » |
|
Блокировки файлов тут в самый раз: открыть, заблокировать, прочесть, изменить, разблокировать, закрыть.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Malaja
|
|
« Ответ #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
|
|
« Ответ #9 : 28-05-2004 09:32 » |
|
Malaja, можно блокировать один файл. Все программы, работающие с этими файлами, должны будут вначале заблокировать один и тот же файл, а потом читать-писать в этот и остальные. Блокировку нельзя снимать до изменения файла. С семафором то же самое будет - пока блокирован, никто не читает, а как снимешь блокировку, то за содержимое файла уже не отвечаешь.
Тут тебе надо проработать последовательность действий: когда можно уменьшать число лицензий, когда можно просто прочитать, как эти процессы растянуты во времени. Лучше будет за одну блокировку прочесть и изменить. Можно в два приема с проверкой: прочесть, а перед изменением прочесть еще раз и проверить.
Дома у меня валяется прекрасная книжка тов. Стивенсона - посмотрю что он рекомендует.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Malaja
|
|
« Ответ #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
|
|
« Ответ #11 : 28-05-2004 11:09 » |
|
При закрытии файла блокировки снимаются автоматически, т.к. они существуют только в ядре, привязаны к структуре, описывающей открытый файл, и не имеют ни какого отношения к реальной файловой системе. Если ты попытаешься разблокировать незаблокированный файл, то, я думаю, ничего страшного не произойдет - или OK, или ошибка. Лучше, конечно, в доке посмотреть. Я напутал - не Стивенсон, а Стивенс (W. Richard Stevens). Книг по unix у него много и они очень детальные. Вот эта книга.yandexfflush() - сбрасывает данные из буферов ядра на физический носитель. Если файл на твоем локальном диске, то это не обязательно - ядро само разрулит. Но, если сомневаешься, или файл лежит на другой машине, то используй. Например: после записи блока данных в файл, выполни 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
|
|
« Ответ #13 : 28-05-2004 14:46 » |
|
oj, eto ja sluchajno ne uwidela, chto menja uge otmeldowali, izwinjajus! :oops:
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Malaja
|
|
« Ответ #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
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
|