VC環境でアトミックな数を入手する関数ってあるのでしょうか?

[戻る]
yoshi-chan 2002/01/13(日) 09:22:08
当方、Win98 & VC++(C言語ですが・・・) でプログラミングをしております。

Mutex機能を自分で実装したいのですが、VCにはある時点で(システム上で)唯一の数を取得ができる
関数ってあるのでしょうか?
やっぱりアセンブラのCLIとか使わないと無理なのでしょうか・・?

なぜMutex機能を自分で作りたいかというと、
#include <stdio.h>

int
main(int argc,char** argv){
   FILE *open_file1;

   open_file1 = fopen(".....","rw");
   ...

   return 0;
}

というコードがあって、このプログラムが重複起動されて同じファイルにアクセスされるのが非常に困るのです・・・。
_beginingthread(...)とか、あるプログラムの中でスレッドを使用するのなら、

hMutex = CreateMutex(NULL,FALSE,NULL);
WaitForSingleObject(hMutex,INFINITE);
...
クリティカルな処理
...
ReleaseMutex(hMutex);
でも良いと思ったのですが、スレッドを持たないプログラムの重複起動の場合にはCreateMutexはダメですよね?
しかも、それは遅くなるから使うなとも言われました・・・。

どうかご教授お願い致します。

ps)
条件として、重複起動は許すってのがあるんです、でも安全で高速なコードってのが上司から言われたんです・・・。
うう・・・大学にいたころの宿題やってるみたいだ・・・。

TAKA 2002/01/16(水) 10:44:14
回避策ではだめなんでしょうか?
たとえば、こんな方法等・・・

{
// 開くファイルの\→@に変換した文字列を作成
// if ( temp\作成した文字列名があるかチェック ) {
// あったら処理終了関数抜ける
// } 
// else { 無いなら temp\作成した文字列を0バイトで保存
//
//      なんらかの処理
//
//      終了後保存したファイル削除
// }
}

yoshi-chan 2002/01/16(水) 19:04:11
返信ありがとうございました。

以前、それだと同じプロセス内でのスレッド回避ができないと思いやめました。

アセンブリでレジスタ使って制御するようにします。

yoshi-chan 2002/01/16(水) 19:27:27
[[解決]]
済みにチェック入れるのを忘れてました・・・。

YuO [E-Mail] 2002/01/17(木) 03:49:27
本当に解決しましたか?

レジスタはCPUのタスク単位で保存されます。
なので,スレッド間でレジスタを使って情報を渡すことはできません。

同期をとりたいなら,素直にMutexやSemaphoreを使うべきです。
ファイルを使って無理に同期をとったりするよりよっぽど安全で,速いはずです。

古いスレッドには追加発言できません。