• 締切済み

クリティカルセクション中にreturnすると?

宜しくお願いします。 コーディングしていてクリティカルセクションについて、ふと疑問に思ったので質問させてください。 以下のように、クリティカルセクション内に条件Aであればreturnを返す関数(funcA)があり、 # クリティカルセクション内を通れるのは1スレッドのみ void funcA( void ){ EnterCriticalSection(&cs);    if( 条件A) {     return; } LeaveCriticalSection(&cs); } あるスレッドが条件Aを満たして LeaveCriticalSection()の前に関数を抜けた場合、他のスレッドはこのクリティカルセクション内を通ることができるのでしょうか? それともEnterCriticalSection()でずっと待ち続ける? もしくはそもそもビルドできない? 試してみればいいじゃないか。という突っ込みはなしで教えてくださる優しい方、 宜しくお願いいたします。

みんなの回答

  • hoge1229
  • ベストアンサー率29% (58/194)
回答No.1

ロックされ続けるだけなので、finallyでロックを解放すべきかと。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C/C++ return文で関数の返却値を返却

    まず、処理がエラーだと-1を返し、正常だと0を返す関数が2つあり、それぞれint funcA()、int funcB()とします。 この時、それらとは別の関数で以下のようにreturn文を書くとどのように値を返しますか? return funcA() || funcB(); 共に0を返す時、どちらかが0を返し他方は-1を返す時、共に-1を返す時についてご教示願います。 またあえてこのように記述するくらいならノーマルに以下の記述の方が良いですか? if (funcA() != 0 || funcB() != 0 ) { return -1; } else { return 0; } (インデントしていないので読みづらかったらすみません)

  • returnと条件式内の代入

    Cでmemcmpライクな関数が必要になり作りました。(正確には中でmemcmpを何回か呼び出して比較をする関数) そのときに出た疑問なのですが、ループ内でif文→returnとするのと、ループの条件にif文の条件を織り込んで、関数の最後でreturnするのとどちらが良いのか。 作った後で、いくつかのサイトでreturnはまとめるほうがいいとありましたので2つめの関数も考えました。しかし、条件式に=(代入)を書くのは好ましくないとする考えもあるようで、もう一つ作りました。しかし、初期化直後のretを比較するのは気分が悪いのです。悩んでいます。つまり、次のような関数でより好ましいのはどれでしょうか? (いずれも質問用にmemcmpに書き直してます) int mymemcmp(const void *a, const void *b, size_t cnt) {   const unsigned char *ap = a, *bp = b;   int i, ret;   for (i=0; i<cnt; i++)   {     ret = ap[i] - bp[i];     if (ret != 0)     {       return ret;     }   }   return 0; } int mymemcmp(const void *a, const void *b, size_t cnt) {   const unsigned char *ap = a, *bp = b;   int i, ret=0;   for (i=0; i<cnt && (ret = ap[i] - bp[i]) == 0; i++)     ;   return ret; } int mymemcmp(const void *a, const void *b, size_t cnt) {   const unsigned char *ap = a, *bp = b;   int i, ret=0;   for (i=0; ret == 0 && i<cnt; i++)   {     ret = ap[i] - bp[i];   }   return ret; }

  • メモリアクセスの競合について

    0または0xffが格納されたあるアドレスに対して、 A: 複数のスレッドが非同期に0xffの書き込みをし、 B: 一つのスレッドが繰り返し読み出して非0の判定をし、0の書き込みをした場合、 プログラムの実行上、どのようなリスクがあるでしょうか。 //global_flagの読み出し、書き込みは、funcA, funcBでしか行わない char global_flag = 0; void funcA(void) { if(use_cache()) { global_flag = 0xff; } } //呼ばれる頻度はfuncAの100分の1以下。 // void funcB(void) { if(global_flag != 0) { //この間にfuncAがglobal_flagに0xffを代入しても、 //もう既にfree_cache()を呼ぶことが確定しているので問題はない global_flag = 0; //以下を実行中にfuncAがglobal_flagに0xffを代入しても、 //次回のfuncB実行時にfree_cache()が呼ばれるので問題はない free_cache(); } }

  • C言語での単体テストの作成について質問です。

    C言語での単体テストの作成方法がわからずに困っています。 以下のようなA.cの中のFuncA関数のテストを作成しています。 /*** A.c ********************/ #include "B.h" int FuncA (int n) { int temp; if (FuncB() == true) temp = n * 2; else temp = n / 2; return temp; } /****************************/ FuncA関数は中でB.c内のFuncB関数を読んでいますが、 これは、B.h、B.cに定義されている関数です。 このFuncB関数は本物のソースを使用せず、スタブを使用してテストを作成しています。 FuncB関数のスタブは以下のように考えています。 /*** BStub.h ********************/ extern bool retVal extern bool FuncB_Stub(void); /******************************/ /*** BStub.c ********************/ #include "BStub.h" bool retVal; bool FuncB_Stub(void) { return retVal; } /******************************/ できる限り、A.cに単体テスト用のコードを埋め込まずにテストを作成したいのですが、 FuncA関数がFuncB関数ではなく、BStubのFuncB_Stub関数を呼び出すようにするには どのようにしたらよろしいでしょうか?

  • PHPのreturnについて

    function hoge(){ if(条件){ return false; } 処理A; return true;  } 上記のような場合if文内通ると、return falseするのでその後の処理Aは走らないですよね? 頭がこんがらがってきました・・・

    • ベストアンサー
    • PHP
  • 関数におけるif文とreturn文について

    ◎1-------------------------------------------- #include<stdio.h> #include<math.h> double maxdt(double a,double b); void disp_sqrt(double n); int main(void) { double mx; mx=maxdt(22.33,44.55); printf("mx=%f\n",mx); disp_sqrt(3.0); disp_sqrt(-6.0); return 0; } double maxdt(double a,double b) { if(a>b) return a; else return b; } void disp_sqrt(double n) { if(n<=0.0) return; printf("%f の平方根=%f\n",n,sqrt(n)); } ----------------------------------------------- ◎2------------------------------------------- #include<stdio.h> #include<math.h> double maxdt(double a,double b); void disp_sqrt(double n); int main(void) { double mx; mx=maxdt(22.33,44.55); printf("mx=%f\n",mx); disp_sqrt(3.0); disp_sqrt(-6.0); return 0; } double maxdt(double a,double b) { if(a>b) return a; else return b; } void disp_sqrt(double n) { if(n<=0.0){ return; printf("%f の平方根=%f\n",n,sqrt(n)); } } ----------------------------------------------- ◎3-------------------------------------------- #include<stdio.h> #include<math.h> double maxdt(double a,double b); void disp_sqrt(double n); int main(void) { double mx; mx=maxdt(22.33,44.55); printf("mx=%f\n",mx); disp_sqrt(3.0); disp_sqrt(-6.0); return 0; } double maxdt(double a,double b) { if(a>b) return a; else return b; } void disp_sqrt(double n) { if(n<=0.0){ return; } else{ printf("%f の平方根=%f\n",n,sqrt(n)); } } -------------------------------------------------- ◎1は参考書を参考に作ったものです。 ◎1は正常に動きます。 以上3つのプログラムで、疑問に思ったのは、関数「void disp_sqrt(double n);」についてなのですが、自分はif文が文が1つでもカッコ{ }を付けたい考えなので、◎1の「void disp_sqrt(double n)」の関数のif文に{}を付けようと思い、まず◎2のように変えたところ、平方根の表示が何も出ませんでした。 return文も文の1つだと考え、◎3のような形は正常に動きました。 return文とprintf文の2つの文があるという考えは間違っているのでしょうか? 後、◎1は何故{ }が無くてもよく、◎2は何も表示されないのでしょうか? 教えていただけると嬉しいです。

  • return 1

    #include<stdio.h> int fact(int num); int main(void) { int i; printf("Input figure freely:"); scanf("%d", &i); printf("%d", fact(i)); return 0; } int fact(int num) { if(num>0){ return num * fact(num-1); }else{ return 1; } } -------------------------------------------- 上のプログラムは再帰呼び出しを使った階乗計算の プログラムです。 func()関数内のreturn 1の意味をどなたか教えて いただけないでしょうか?

  • クリティカルセクションの使用箇所について

    スレッドAで通常読み書きを行っている、非常に関係性の深い変数が複数あり、それらは書き換えられる場合、同一関数内などでほぼ同時に書き換えられるとき スレッドBからは全く書き換えは行わず、読み取り専用のアクセスのみをするとし 一つのCRITICAL_SECTIONでそれらを全て保護するとすれば Aで書き換えを行う(或いはそのための計算)部分は全てを囲み (つまり全ての変数を囲う) また、それらの変数がスレッドBから参照される部分は囲む これでスレッドセーフになり、それ以外は囲う必要はない。 (例えばスレッドAから単に読み取り専用のアクセスをされる場合などは普通にシングルスレッドと同様の考え方で良い) という考えで問題ないでしょうか? また、スレッドAからしか書き換えを行わなければ いくつ読み取り専用の別スレッドが出来たとしても 同様に Aで書き換えを行う部分と スレッドCやスレッドD・・・ から参照される部分さえ囲んでおけばスレッドセーフになる という考えで問題ないでしょうか?

  • C言語のreturnの使い方

    return a, b; のように2つの引数で値を返せることを最近になり 知りました。ところで以下のような使い方は可能でしょうか? test( , )という2つの引数が必要な関数にnum()で return 1,2としてひとつの関数呼び出しで引数2個分に すると言うようなことです。 #include <stdio.h> int test( int i, int j){   printf("%d %d",i,j); } int num(void){   return 1,2; } int main(void){   test( num() ); }

  • 関数ポインタの型をtypedefしたとき

    C言語において、関数ポインタの型をtypedefで作ると、 typedef int (*MyFunc)(int*,int*); と宣言でき、関数ポインタの変数は、 int FuncA(int* a, int* b) { ~ } void main_loop() { MyFunc pf = FuncA; ~ (*pf)(pa,pb); } というように使うと思います。 ここで疑問なのですが、この実際に呼び出される関数、FuncAの定義に、typedef(ここではMyFunc)を使えないものでしょうか? 同じことを2回やっているようで、無駄に思えてしまいます。