| 
			| 
					
						| 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 у него много и они очень детальные.Вот эта книга.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 | 
								|  | « Ответ #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
 |  
						| 
								|  |  
								|  |  Записан | 
 
 холоднокровней, Маня, Ви не на работе---------------------------------------
 четкое определение сущности бытия:
 - А мы в прошлом или в будущем?- спросила Алиса.
 - Мы в жопе, - ответил кролик.
 - А "жопа" - это настоящее? - спросила Алиса.
 - А "жопа" - это у нас символ вечности.
 |  |  | 
	|  |