共有メモリー上のmemcpy
Posted: 2012年11月06日(火) 13:55
DOONといいます。はじめまして。
すごい基本的な事かも知れませんが、よろしくです。
環境 VisualC++ 6.0 sp6 WindowsXP 32Bit ServicePack3
構造体メンバのアライメント 8バイト
プログラムAとBが起動時に,
CreateFile( name, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,TRUNCATE_EXISTING
, FILE_ATTRIBUTE_NORMAL,NULL);
CreateFileMapping(HANDLE , NULL , PAGE_READWRITE , 0 , 100 , NAME);を使用して、
構造体1をWindowsの共有メモリ―に載せます。
構造体1のメンバは、char buf[100]だけとします。
プログラムAが共有メモリ―を書き込み処理のみ
プログラムBが共有メモリ―の読み込み処理のみを行うようなプログラムにしています。
排他は一切使用していません。
この環境で、プログラムAが共有メモリーの値を 0000000199 から 0000000200に書き換えたとします。
その書き換え方法はmemcpy(共有メモリポインター , "0000000200" , 10)を使用します。
ちょうど、この隙間ぐらいにプログラムBが共有メモリ―を読み込みに行った場合、
0000000299と読み込んでしまう可能性はあるのでしょうか?
memcpyは厳密的に言えば、1バイトずつコピーする もしくは8バイト(32bit)単位で
コピーするとしたら、この状況が起こり得るのでは、ないかと心配しています。
実際、タイマーを使用して、負荷テストプログラムを作成したのですが
現象はでませんでした。
理論的に排他をする必要があるかどうかを知りたいです。
読み込む側が排他を取得するのも、変な気がしています。
intとかだと問題なくて、charだとまずいとかもあるのでしょうか?
よろしくお願いします。
すごい基本的な事かも知れませんが、よろしくです。
環境 VisualC++ 6.0 sp6 WindowsXP 32Bit ServicePack3
構造体メンバのアライメント 8バイト
プログラムAとBが起動時に,
CreateFile( name, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,TRUNCATE_EXISTING
, FILE_ATTRIBUTE_NORMAL,NULL);
CreateFileMapping(HANDLE , NULL , PAGE_READWRITE , 0 , 100 , NAME);を使用して、
構造体1をWindowsの共有メモリ―に載せます。
構造体1のメンバは、char buf[100]だけとします。
プログラムAが共有メモリ―を書き込み処理のみ
プログラムBが共有メモリ―の読み込み処理のみを行うようなプログラムにしています。
排他は一切使用していません。
この環境で、プログラムAが共有メモリーの値を 0000000199 から 0000000200に書き換えたとします。
その書き換え方法はmemcpy(共有メモリポインター , "0000000200" , 10)を使用します。
ちょうど、この隙間ぐらいにプログラムBが共有メモリ―を読み込みに行った場合、
0000000299と読み込んでしまう可能性はあるのでしょうか?
memcpyは厳密的に言えば、1バイトずつコピーする もしくは8バイト(32bit)単位で
コピーするとしたら、この状況が起こり得るのでは、ないかと心配しています。
実際、タイマーを使用して、負荷テストプログラムを作成したのですが
現象はでませんでした。
理論的に排他をする必要があるかどうかを知りたいです。
読み込む側が排他を取得するのも、変な気がしています。
intとかだと問題なくて、charだとまずいとかもあるのでしょうか?
よろしくお願いします。