2016-11-06 6 views
-2
vector<thread>* myVector; 

スレッドポインタのベクトルを宣言するために使用したものです。ポインタのベクトル、要素を押すための構文

thread* new_thread = new thread(chef_thread,&kill, new std::mutex, &foodQ,  
    numberChefs); //New Thread 
myVector->push_back(*new_thread); 

Chef_Threadは上記の同じ.cppファイルで宣言した関数です。

私はコードをコンパイルしようとするとすべてが地獄に行きます。 ありがとう!

+0

あなたが表示するコードの問題は何ですか?ビルドエラーが出ますか?実行時エラーまたはクラッシュ予想外の結果ですか?他に何か?詳しく教えてください!また、[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)を読んで[最小限の、完全で検証可能な例]を作成する方法を学んでください(http:// stackoverflow .com/help/mcve)。 –

+0

あなたは何のエラーがありますか? "すべてが地獄に行く"助けていない! – HazemGomaa

+0

(おそらく)無関係なノートでは、オブジェクトを作成するために 'new'を使う必要があるJavaやC#や他の言語から来ていますか?それはC++では必要ないからです。実際、vectorにpushした後に 'new_thread'を削除しないと、メモリリークが発生します。少なくとも今のコードと同じです。 –

答えて

2

vector<thread>* myVector;は、vectorへのポインタをthreadに宣言します。

タイプはvector<thread*>で、vectorthreadポインターと宣言されています。

+1

それはスマートポインタのベクトルではありませんか? 'vector >' –

1

user2899162は、コードの直接のエラーを指摘するのは正しいです。しかし、私はポインタを使用する必要は全くないとは思っていません。

原則として、あなたのプログラムには生の - 手動入力 - newdeleteはありません。それは手動のリソース管理なので、になります。代わりに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コンテナ、スマートポインタおよび他のリソースラッパーがどのように機能するかです。

関連する問題