回答:
スレッドに実行させる関数を作成します。例:
void task1(std::string msg)
{
std::cout << "task1 says: " << msg;
}
次に、thread
最終的に上記の関数を呼び出すオブジェクトを次のように作成します。
std::thread t1(task1, "Hello");
(クラス#include <thread>
にアクセスする必要がありますstd::thread
)
コンストラクターの引数は、スレッドが実行する関数で、その後に関数のパラメーターが続きます。スレッドは構築時に自動的に開始されます。
後で関数の実行が完了するまでスレッドを待機したい場合は、次を呼び出します。
t1.join();
(結合とは、新しいスレッドを呼び出したスレッドが、新しいスレッドの実行が完了するのを待ってから、それ自体の実行を継続することを意味します)。
#include <string>
#include <iostream>
#include <thread>
using namespace std;
// The function we want to execute on the new thread.
void task1(string msg)
{
cout << "task1 says: " << msg;
}
int main()
{
// Constructs the new thread and runs it. Does not block execution.
thread t1(task1, "Hello");
// Do other things...
// Makes the main thread wait for the new thread to finish execution, therefore blocks its own execution.
t1.join();
}
-std=c++0x -pthread
ます。-std=c++0x
(の代わりに-std=c++0x
)を使用」では、2番目の「c ++ 0x」を「c ++ 11」にする必要があると思いますが、編集が小さすぎるため変更できません。
task1
です。したがって、関数ポインタもで表されtask1
ます。しかし、私は私が間違っていたと考えているので、これを育ててくれてありがとう、それはと同等だ&task1
、それは、私は、関数のポインタにそのポインタを推測もしそうなら、あなたが(書き込みに選択形成している問題ではないですので、&&task1
- それは悪いだろう)。関連質問。
まあ、C ++ std::thread
はc ++ 0xでストックモデルを指定しただけなので、技術的にはそのようなオブジェクトはすべてCスタイルのスレッドライブラリ上に構築されてしまいます。問題はやや体系的であり、技術的には既存のc ++メモリモデルは、すべての「前に起こる」ケースに対して明確に定義されたセマンティクスを可能にするほど厳密ではありません。Hans Boehmはしばらく前にこのトピックに関する論文を書いており、このトピックに関するc ++ 0x標準を打ち出すのに役立ちました。
http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html
そうは言っても、実際には問題なく動作するクロスプラットフォームのスレッドC ++ライブラリがいくつかあります。インテルスレッドビルディングブロックには、c ++ 0x標準に非常に近いtbb :: threadオブジェクトが含まれており、Boostには、同じことを行うboost :: threadライブラリがあります。
http://www.threadingbuildingblocks.org/
http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html
boost :: threadを使用すると、次のようになります。
#include <boost/thread.hpp>
void task1() {
// do stuff
}
void task2() {
// do stuff
}
int main (int argc, char ** argv) {
using namespace boost;
thread thread_1 = thread(task1);
thread thread_2 = thread(task2);
// do other stuff
thread_2.join();
thread_1.join();
return 0;
}
POSIXオペレーティングシステム用のPOSIXライブラリもあります。 互換性を確認する
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <iostream>
void *task(void *argument){
char* msg;
msg = (char*)argument;
std::cout<<msg<<std::endl;
}
int main(){
pthread_t thread1, thread2;
int i1,i2;
i1 = pthread_create( &thread1, NULL, task, (void*) "thread 1");
i2 = pthread_create( &thread2, NULL, task, (void*) "thread 2");
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
return 0;
}
-lpthreadでコンパイルする
#include <thread>
#include <iostream>
#include <vector>
using namespace std;
void doSomething(int id) {
cout << id << "\n";
}
/**
* Spawns n threads
*/
void spawnThreads(int n)
{
std::vector<thread> threads(n);
// spawn n threads:
for (int i = 0; i < n; i++) {
threads[i] = thread(doSomething, i + 1);
}
for (auto& th : threads) {
th.join();
}
}
int main()
{
spawnThreads(10);
}
新しいスレッドで独自のインスタンスメソッドの1つを呼び出すC ++クラスの例を検索すると、この質問が出てきますが、そのようにこれらの回答を使用することはできませんでした。これを行う例を次に示します。
Class.h
class DataManager
{
public:
bool hasData;
void getData();
bool dataAvailable();
};
Class.cpp
#include "DataManager.h"
void DataManager::getData()
{
// perform background data munging
hasData = true;
// be sure to notify on the main thread
}
bool DataManager::dataAvailable()
{
if (hasData)
{
return true;
}
else
{
std::thread t(&DataManager::getData, this);
t.detach(); // as opposed to .join, which runs on the current thread
}
}
この例は、ミューテックスやロックには入りません。
グローバルネームスペースに個別の関数が必要でない限り、スレッドを作成するためにラムダ関数を使用できます。
ラムダを使用してスレッドを作成する主な利点の1つは、ローカルパラメーターを引数リストとして渡す必要がないことです。同じためにキャプチャリストを使用でき、ラムダのクロージャプロパティがライフサイクルを処理します。
これがサンプルコードです
int main() {
int localVariable = 100;
thread th { [=](){
cout<<"The Value of local variable => "<<localVariable<<endl;
}}
th.join();
return 0;
}
はるかに、C ++ラムダは、特に単純なスレッド関数用のスレッドを作成する最良の方法であることがわかりました
使用するライブラリに大きく依存します。たとえば、wxWidgetsライブラリを使用する場合、スレッドの作成は次のようになります。
class RThread : public wxThread {
public:
RThread()
: wxThread(wxTHREAD_JOINABLE){
}
private:
RThread(const RThread ©);
public:
void *Entry(void){
//Do...
return 0;
}
};
wxThread *CreateThread() {
//Create thread
wxThread *_hThread = new RThread();
//Start thread
_hThread->Create();
_hThread->Run();
return _hThread;
}
メインスレッドがCreateThreadメソッドを呼び出す場合は、 "Entry"メソッドのコードの実行を開始する新しいスレッドを作成します。参加または停止するには、ほとんどの場合、スレッドへの参照を保持する必要があります。詳細はこちら:wxThreadのドキュメント