[Visual Studio Professional 2012 を使用した C++]
こんにちは、私は std::mutex を使用して main() が 2 番目のスレッドがアクセスしている変数を変更するのを防ぐのに問題があります。次の例 (実際のプログラムを大幅に簡略化したもの) では、関数 update() が main() の std::thread t2 から実行されます。update() は、ベクトル world.m_grid[i][j].vec が空かどうかを確認し、そうでない場合は、含まれている値を変更します。main() もこのベクトルにアクセスし、場合によってはクリアします。その結果、main() が update() の空のチェックの後、world.m_grid[i][j].vec[0] が変更される前にベクトルをクリアすると、次のようになります。範囲外のベクトル添え字エラー。std::mutex を使用して、update() の空のチェックの前にバリアをロックし、world.m_grid[i][j].vec[0] が update() によって変更された後にバリアを解放することで、これが起こらないようにしようとしています。 、
#include <cstdlib>
#include <thread>
#include <mutex>
#include <vector>
using namespace std;
mutex barrier;
class World
{
public:
int m_rows;
int m_columns;
class Tile
{
public:
vector<int> vec;
int someVar;
};
vector<vector<Tile> > m_grid;
World (int rows = 100, int columns = 200): m_rows(rows), m_columns(columns), m_grid(rows, vector<Tile>(columns)) {}
};
void update(World& world)
{
while (true)
{
for (int i = 0; i < world.m_rows; ++i)
{
for (int j = 0; j < world.m_columns; ++j)
{
if (!world.m_grid[i][j].vec.empty())
{
lock_guard<mutex> guard(barrier);
world.m_grid[i][j].vec[0] += 5;
}
}
}
}
}
int main()
{
World world;
thread t2(update, ref(world));
while (true)
{
for (int i = 0; i < world.m_rows; ++i)
{
for (int j = 0; j < world.m_columns; ++j)
{
int random = rand() % 10;
if (world.m_grid[i][j].vec.empty() && random < 3) world.m_grid[i][j].vec.push_back(1);
else if (!world.m_grid[i][i].vec.empty() && random < 3) world.m_grid[i][j].vec.clear();
}
}
}
t2.join();
return 0;
}
ここで何か基本的なことが欠けているに違いありません。理想的には、ソリューションは world.m_grid[i][j] をロックダウンするだけで (残りの world.m_grid は main() にアクセスできるようにします)、クラス「Tile」にミューテックスを含める必要があると思いますが、ここで説明されているのと同じ問題: WINdows SOCKET を使用する構造体で使用すると、std::mutex が C2248 を作成するのはなぜですか? 説明されているソリューションを私のプロジェクトに適応させることができなかったので、誰かが私を助けることができれば非常に役に立ちます.
-お時間をいただきありがとうございます。
[編集] つづり