Citat:
leka: Ima vise mogucih alternativa. Evo nekih:
1) Mozes koristiti read-write lock. Prva instanca aplikacije zakljuca fajl, recimo C:/tmp/myapp.lock (napravi fajl ako ne postoji), kada se startuje druga instanca, onda ona pokusa da lokuje fajl, ako ne uspe ugasi se.
RWlock kao kernelov sinkronizacijski primitiv dolazi tek u Visti, premda ga nije previše teško ručno izgraditi nad tradicionalnim win32 API-jem. Na Win32 bi analog bio uzajamno isključiv pristup nekom praznom dummy fajlu u temp direktoriju čiji bi pristup bio sinkroniziran sa LockFile().
Citat:
2) Slicna prica kao u prethodnom. U Registry napravis kljuc HKEY_CURRENT_USER/Software/MyApp/lock i setujes mu vrednost tako sto uzmes PID od programa. Druga instanca otvori Registry, pogleda tu vrednost i uporedi sa svojim PID-om, ako nije isti, gasi se. Ne treba napominjati da je odgovornost prve aplikacije da obrise lock vrednost prilikom gasenja, inace se program vise nikada nece startovati. :D
Zato i jest bolje koristiti kernel objekte koje imaju koncept vlasništva (ownership), poput mutexa. U slučaju terminiranja niti koja ga je stvorila (npr. glavne niti procesa koja izlazi kad i proces sam), WFSO() će vratiti WAIT_ABANDONED i novi proces će automatski preuzeti vlasništvo. Ime mutexa je najbolje generirati prilikom instalacije kao GUID.