排他制御である「トイレのロックのプログラム」をC言語で簡単に教えて欲しい

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/12/08 19:57:57
  • 終了:--

回答(2件)

id:Ma2 No.1

Ma2回答回数11ベストアンサー獲得回数02005/12/11 11:19:25

ポイント10pt

これのことかな?


さて、排他制御はハードウェアの機能を使わないと実現できないので、ハード依存になります。

言い換えると、C言語自体にはその機能がなく、C以外で作成された関数を呼び出すことになります。


たとえばWindowsでSpinlockを使うなら、DDKを利用して

AllocateSpinLock() でSpinlockを作成、

AcquireSpinLock() でロックして

ReleaseSpinLock() でロック解除、

FreeSpinLock() で削除します。

これらの関数も大部分はCで書かれているはずですが、肝心のメモリのロックはCで書けないのでCではないはずです。

id:nitscape No.2

nitscape回答回数526ベストアンサー獲得回数02005/12/08 20:26:39

ポイント40pt

かなりテキトウなプルグラムですが例えば以下のようなものでしょうか?

起動すると成功します(succeededと表示される)が、1つプログラムを起動したまま同じプログラムをもう1回起動すると失敗します(failedと表示される)。


つまり、1つ起動している(トイレに鍵がかかっている)ときは、もう1つ起動することはできません(誰かが入ることはできません)。


#include ”stdafx.h”

#include <io.h>

#include <sys/locking.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <share.h>


int main(int argc, _TCHAR* argv[])

{

int fh;


fh = _sopen( ”c:¥¥test.txt”, _O_CREAT | _O_TRUNC,_SH_DENYNO,_S_IREAD | _S_IWRITE );

if( fh == -1 )

{

printf( ”failed¥n” );

return0;

}


if( _locking( fh, LK_NBLCK, 30L ) != -1 )

{

printf(”succeeded¥n”);

while(1)

{

;

}

}

else

printf( ”failed¥n” );


_close( fh );


return 0;

}

id:daisuke_master

コンパイルできませんが?

2005/12/14 09:30:13

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません