マルチスレッドでバグが発生します
実際のプログラムでバグが出たので、簡易化したプログラムでテストしてみましたがどこが悪いのか分かりませんでした。
#include <WinSock2.h>
#include <vector>
#include <process.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
CRITICAL_SECTION cs;
unsigned __stdcall Login( void * );
int main()
{
vector<unsigned int> thID;
vector<HANDLE> hTh;
for( int i=0 ; i<10 ; i++ )
{
printf( "メインスレッド:%d\n", i );
if( (i%2) == 0 )
{
thID.push_back( i );
hTh.push_back( (HANDLE)_beginthreadex(NULL, 0, Login, &i, 0, &thID[i]) );
}
}
while(1)
{
for( int i=0 ; i<10 ; i++ )
{
if( hTh[i] != NULL )
{
CloseHandle(hTh[i]);
}
}
char a[2];
scanf( "%c", a );
if( strcmp( a, "X" ) == 0 )
{
return 0;
}
}
}
unsigned __stdcall Login( void *Num )
{
int *a = (int *)Num;
for( int i=0 ; i<10 ; i++ )
{
printf( "サブスレッド%d:%d\n", *a, i );
}
return 0;
}
出るエラーは以下のようになります
Windows によって Server.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。Server.exe または読み込まれた DLL にバグがあります。
あるいは、Server.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
if( (i%2) == 0 )
をコメントアウトするとエラーは出ません
また、共に
表示される例として(見やすいように空行あり)
以下のように、
スレッド番号が+1されていたり(A)
各スレッド内のループ回数が直前のスレッドの回数を引き継いでいたり(B)
スレッドのループ回数が初期化されていたり(C)
呼び出されてないはずのスレッドが起動していたり(D)
します
メインスレッド:0
メインスレッド:1
サブスレッド1:0 ・・・・・・A(本来はサブスレッド0のはず)
サブスレッド1:1
メインスレッド:2
サブスレッド2:3 ・・・・・・B(本来はサブスレッド2:0のはず)
サブスレッド2:4
サブスレッド2:5
サブスレッド1:0 ・・・・・・C(本来は1:3のはず)
サブスレッド1:1
サブスレッド2:0
サブスレッド3:0 ・・・・・・D(本来はまだ起動してないはず)
サブスレッド3:1
メインスレッド:3
どこを直せばいいか教えてください
お礼
回答とサイトの紹介ありがとうございます! これを見て色々とバグ予防してみますφ(._.) バグが多く、まれにデータ破損もあるとは聞いていて覚悟の上でプレイしていたのですが、実際に起こるとショックです。 それと、材料がなくても冷蔵庫から普通に料理を選択して調理できることをすっかり忘れていました。 けれど買い物出来ないのはやっぱり困りものです…。