同時、std::condition_variable_any

1708 ワード

特定の条件の起動を待って、条件変数は通常、反発ロックと組み合わせて使用されます.mutexは一般的にリソースに対してプリエンプト式であり、スレッドが先に実行されるのを待ってから使用可能な条件変数を実行します.
 
 
変数コードを待つ場合はmutexも使用する必要があります.                 呼び出しのスレッドはmutexをロックしてから、変数を待つ関数を呼び出す必要があります.呼び出し関数が返されるとmutexはブロックされます.スレッド待機条件がtrueになるとmutexはロックされません.予知できない結果なので、環境変数を待たない各スレッドは同じmutexオブジェクトを使用する必要があります.
タイプcondition_variable_anyオブジェクトは、任意のタイプのmutexで使用できます.mutexで使用されるタイプはtry_を提供する必要はありません.lockメソッド.タイプcondition_variableオブジェクトはunique_のみlockタイプmutex.このタイプのオブジェクト比タイプcondition_variable_anyオブジェクトは速いかもしれません.
イベントを待つには、mutexをロックしてから、条件変数のwaitメソッドを呼び出します.別のスレッドでwaitブロック終了条件変数が呼び出されるまで.
変数待ちスレッドがキャンセルされ、通知がない場合は、「仮想」が起動します.この「仮想」起動を認識するには、条件がtrueになったコードが条件を明示的にチェックし、コードが待機機能から戻った場合に条件を確認します.ループを使用します.これは通常実行されます.このループはwait(unique_lock&lock,Predicate pred)を使用して実行できます.
.
//              

std::mutex _mutex;//     

std::condition_variable_any condition;//      

int x = 1;//    

void func_1()//write thread
{
	Sleep(100);

        { 
	    lock_guard<std::mutex> lock(_mutex);
	    x += 1;
        } 
	condition.notify_one(); //  ,           

}

void func_2()//read thread
{
	unique_lock<std::mutex>lock(_mutex) ;

	condition.wait(_mutex);//     ,            ,
	cout << x << endl;

}


int main(int argc, char *argv[])
{

	auto t = std::thread(func_1);//   

	t.detach();

	auto t1 = std::thread(func_2);//   

	t1.detach();

	Sleep(300);

	cout << x << endl;
	cout << "main thread" << endl;



	system("pause");
	return 0;
}

 
MSDNリファレンス、https://msdn.microsoft.com/zh-cn/library/hh874761(v=vs.120).aspx