8-futureその他のメンバー関数、shared_future

3312 ワード

その他のメンバー関数
  • wait_for()status.std::async()のパラメータがstd::launch::deferred(実行遅延)の場合、メインフローは引っかかりません.
  • std::future_status  std::future_status::ready:非同期タスクが完了したことを示すstd::future_status::timeout:非同期タスクがまだ実行されていないことを示し、待機時間を超えています::future_status::deferred:非同期タスクの実行が延期されたことを示し、wait_for()待たなくてもいいです.
  • #include 
    #include 
    #include 
    
    using namespace std;
    
    int mythread()
    {
    	cout << "mythread start, thread id: " << std::this_thread::get_id() << endl;
    	std::this_thread::sleep_for(5s); //	    
    	cout << "mythread end" << endl;
    	return 5;
    }
    
    
    int main()
    {
    	cout << "main thread id: " << std::this_thread::get_id() << endl;
    	std::future result = std::async(std::launch::deferred,mythread);
    	cout << "continue ..." << endl;
    
    
    	std::future_status status = result.wait_for(3s); //	  mythread      ,      
    	if (status == std::future_status::timeout)	//	  ,  mythread  3S    ,      
    	{
    		//           
    		cout << "time out" << endl; 
    	}
    	else if (status == std::future_status::ready)	//	    
    	{
    		//       
    		cout << "mythread execute finished" << endl;
    		cout << result.get() << endl;
    	}
    	else if (status == std::future_status::deferred)	//	    
    	{
    		//	  async          std::launch::deferred,      
    		//	         
    		//	  result.wait_for()       ,      。
    		cout << "deferred " << endl;
    		cout << result.get() << endl;
    	}
    
    	cout << "I Love China" << endl;
    
    	getchar();
    	return 0;	//        ,   mythread         
    }
    

    二shared_future
      std::futureのメンバー関数get()は、移動言語を使用しているため、一度しか呼び出されません.get()を呼び出した後、元のオブジェクトの値を別のオブジェクトに移動します. スレッドの戻り値を複数の他のスレッドに渡す場合は、std::futureではなく、std::shared_を使用します.future.そのget()関数は、意味を移動するのではなく、結果値を別のオブジェクトにコピーします.
    #include 
    #include 
    #include 
    
    using namespace std;
    
    
    int mythread(int para)
    {
    	cout << "my thread start, thread id is " << std::this_thread::get_id() << endl;
    	cout << "parameter is " << para << endl;
    	std::this_thread::sleep_for(5s);	//	    5 
    	cout << "my thread end, thread id is " << std::this_thread::get_id() << endl;
    
    	return para;
    }
    
    void mythread2(std::shared_future &tmp_f)
    {
    	cout << "thread2 result is " << tmp_f.get() << endl;
    }
    
    int main()
    {
    	cout << "main thread id is " << std::this_thread::get_id() << endl;
    	std::packaged_task mypt(mythread);																			
    	std::thread t1(std::ref(mypt), 1);				
    	t1.join();
    
    	std::future result = mypt.get_future();
    	std::shared_future result_s(std::move(result));
    	//	     
    	//std::shared_future result_s(result.share());	//	     ,result_s  ,result  
    
    	bool vaild = result_s.valid(); //     result_s        
    	cout << result_s.get() << endl;
    	cout << result_s.get() << endl;	//	  get,       
    
    	std::thread	t2(mythread2, std::ref(result_s));
    	t2.join();
    
    	cout << "I Love China" << endl;
    
    
    	getchar();
    	return 0;
    }