VC環境でアトミックな数を入手する関数ってあるのでしょうか? – プログラミング – Home

VC環境でアトミックな数を入手する関数...
 
通知
すべてクリア

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


yoshi-chan
 yoshi-chan
(@yoshi-chan)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

当方、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
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

回避策ではだめなんでしょうか?
たとえば、こんな方法等・・・

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


返信引用
yoshi-chan
 yoshi-chan
(@yoshi-chan)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

返信ありがとうございました。

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

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


返信引用
yoshi-chan
 yoshi-chan
(@yoshi-chan)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

済みにチェック入れるのを忘れてました・・・。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 23年前
投稿: 252
 

本当に解決しましたか?

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました