user2899162は、コードの直接のエラーを指摘するのは正しいです。しかし、私はポインタを使用する必要は全くないとは思っていません。
原則として、あなたのプログラムには生の - 手動入力 - new
とdelete
はありません。それは手動のリソース管理なので、はになります。代わりにRAIIを使用してください。つまり、オブジェクトのスコープの終わりにあるコンストラクタとデストラクタの自動実行を利用して、手動のリソース管理を避けます。 [1]
std::vector<std::thread> threads;
threads.push_back(std::thread(
chef_thread,
&kill,
std::mutex(), // this is weird, see below
&foodQ,
numberChefs));
すべてのスレッドとミューテックスオブジェクトと同様に、それ自体がthreads
とすぐに自動的に破棄されるベクターは、スコープの外に出ます。
奇妙なことに、スタンドアロンのミューテックス(あなたのコードのnew std::mutex
引数)。これにより、chef_thread
関数にのみ知られているミューテックスオブジェクトが作成されます。決定的なことを言うにはもっとコードが必要ですが、ここではエラーが発生します。ミューテックスは共有リソースの同期マカニズムです。リソースにアクセスするすべてのユーザーは、同じmutex経由でにアクセスする必要があります。しかし、1つの関数だけがmutexについて知っていれば、それはどのように可能になりますか?私が見る唯一の方法は、内部のmutexへの参照またはポインタを渡すことです。これは赤いフラグです。chef_thread
[1]もちろん、このルールには例外があります。明白なものはコンストラクタにnew
とそのデストラクタに対応するdelete
を持つラッパー/コンテナクラスです。一言で言えば、それはRAIIを実装する方法であり、それはすべてのstd
コンテナ、スマートポインタおよび他のリソースラッパーがどのように機能するかです。
あなたが表示するコードの問題は何ですか?ビルドエラーが出ますか?実行時エラーまたはクラッシュ予想外の結果ですか?他に何か?詳しく教えてください!また、[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)を読んで[最小限の、完全で検証可能な例]を作成する方法を学んでください(http:// stackoverflow .com/help/mcve)。 –
あなたは何のエラーがありますか? "すべてが地獄に行く"助けていない! – HazemGomaa
(おそらく)無関係なノートでは、オブジェクトを作成するために 'new'を使う必要があるJavaやC#や他の言語から来ていますか?それはC++では必要ないからです。実際、vectorにpushした後に 'new_thread'を削除しないと、メモリリークが発生します。少なくとも今のコードと同じです。 –