MQL의 비동기 및 다중 스레드 프로그래밍 - 페이지 34

 
Andrei Novichkov :
그러나 여기에 내가 궁금한 것이 있습니다. 실제로 스레드 풀이 필요한 작업이 있습니까? 뿐만 아니라 - 내가 스레드를 생성했습니다 - 나는 그것을 잊었고 Williams가 설명하는 유형에 따라 풀, 즉 풀이 끝날 때까지 기다리고 있습니까? 거기에 예를 들어 혼동하지 않으면 ATM처럼 보이지만 그러한 유도 기적이 우리 나라에서 어떤 과업을 정당화 할 수 있습니까? 나는 아직 그런 문제를 생각해내지 못했다. 그런 다음 모든 것이 이미 완료되었으며 문서가 있고 예제가 있는 ThreadPool을 실제로 살펴보는 것은 어떻습니까?

솔직히 말해서 std :: async가 수행 중인 작업에 대한 스레드를 자동으로 생성하고 파괴한다는 점을 제외하고는 std :: async와 스레드 풀 사이에 많은 의미를 부여하지 못했습니다.
그리고 쓰레드 풀을 사용하기 위해서는 프로그램에서 사용하는 쓰레드의 개수를 미리 알고 있어야 하며, 이 숫자를 풀에 명시적으로 설정해야 합니다.
쓰레드 풀은 쓰레드 수 면에서 정적인 것으로 밝혀졌는데, 그렇지 않을 수도 있지만 장담은 할 수 없다.
그러나 책에서 Williams는 std::thread에서 실행할 작업이 너무 많을 때 스레드 풀을 권장한다고 썼습니다.
그리고 아마도 이것은 의미를 완전히 이해할 때까지 std ::async에 적용되지 않을 것입니다.
그리고 비동기는 네트워크 솔루션 및 다중 기호 전략에서 매우 수요가 많으며 로드된 계산에도 유용합니다.
그러나 표준에 std ::async 및 std::promise가 있으면 스레드 풀을 만들 필요가 없는 것 같습니다.

 

여전히 dll에 대한 프로젝트 설정에 대한 질문이 있었습니다.
컴파일러에서 자동으로 dll 종속성으로 끌어오는 사용하지 않는 함수를 제거하는 방법은 무엇입니까?

나는 이미 다른 개발 환경을 시도했고 각각은 사용하지 않는 자체 기능을 가져옵니다.
MSVS_2017은 일반적으로 자체 런타임 종속성을 가져오므로 제거할 수 없습니다.
따라서 다른 IDE를 시도했지만 사용하지 않는 기능도 가져옵니다.
그들을 제거하는 방법?

 
Roman :

솔직히 말해서 std :: async가 수행 중인 작업에 대한 스레드를 자동으로 생성하고 파괴한다는 점을 제외하고는 std :: async와 스레드 풀 사이에 많은 의미를 부여하지 못했습니다.
그리고 쓰레드 풀을 사용하기 위해서는 프로그램에서 사용하는 쓰레드의 개수를 미리 알고 있어야 하며, 이 숫자를 풀에 명시적으로 설정해야 합니다.
쓰레드 풀은 쓰레드 수 면에서 정적인 것으로 밝혀졌는데, 그렇지 않을 수도 있지만 장담은 할 수 없다.
그러나 책에서 Williams는 std::thread에서 실행할 작업이 너무 많을 때 스레드 풀을 권장한다고 썼습니다.
그리고 아마도 이것은 의미를 완전히 이해할 때까지 std ::async에 적용되지 않을 것입니다.
그리고 비동기는 네트워크 솔루션 및 다중 기호 전략에서 매우 수요가 많으며 로드된 계산에도 유용합니다.
그러나 표준에 std ::async 및 std::promise가 있으면 스레드 풀을 만들 필요가 없는 것 같습니다.

따라서 비동기의 요점은 스레드 풀을 사용하고 스레드의 지속적인 생성/삭제와 관련된 오버헤드를 제거하는 것입니다. 비동기가 이를 수행하지 않으면 아무 소용이 없습니다.

글쎄, 일반적으로 나는 비동기에 대해 너무 나쁘게 생각했습니다. 간단한 테스트는 그것을 완벽하게 적절한 것으로 보여줍니다.

 #include <future>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    cout << "Main thread id: " << this_thread::get_id() << endl;
     for ( int i = 0 ;  i < 2 ;  ++ i){
       cout << "------------------------" << endl;
       vector<future< void >> futures;
       for ( int i = 0 ; i < 10 ; ++i)
       {
          this_thread::sleep_for( 1 ms);
          auto fut = async([]{
                              this_thread::sleep_for( 1 s);
                              cout << this_thread::get_id() << '\n' ;
                           });
          futures.push_back(move(fut));
       }
       for (auto &f : futures)
          f.wait();
    }

    cout << endl;
}

Main thread id: 140657228855104

140657228850944
140657220458240
140657212065536
140657203672832
140657195280128
140657186887424
140657178494720
140657170102016
140657161709312
140657153316608
------------------------
140657153316608
140657161709312
140657170102016
140657178494720
140657228850944
140657220458240
140657212065536
140657203672832
140657195280128
140657186887424

두 번째 배치 작업의 경우 이전에 생성된 스레드를 사용하는 async가 새 스레드를 생성하지 않았음을 알 수 있습니다. 그래서 물을 줄 자격이 없었나 봅니다.

 
Roman :

여전히 dll에 대한 프로젝트 설정에 대한 질문이 있었습니다.
컴파일러에서 자동으로 dll 종속성으로 끌어오는 사용하지 않는 함수를 제거하는 방법은 무엇입니까?

mingw의 경우 -static 옵션은 정적에 도움 이 되며 pic 생성을 중지합니다.

 

더 어려운 비동기 테스트

 #include <future>
#include <iostream>
#include <vector>
#include <mutex>
#include <set>
using namespace std;

mutex mtx;
set<thread::id> id;
atomic< unsigned > atm{ 0 };

int main()
{
   for ( int i = 0 ;  i < 10000 ;  ++ i) {
      vector<future< void >> futures;
       for ( int i = 0 ; i < 10 ; ++i) {
         auto fut = async(launch::async,[]{
                                           ++ atm;
                                           lock_guard<mutex> lck{mtx};
                                           id.insert( this_thread::get_id() );
                                        });
         futures.push_back(move(fut));
      }
   }

   cout << "executed " << atm << " tasks, by " << id.size() << " threads\n" ;
}
// cout: executed 100000 tasks, by 10 threads

글쎄, 일반적으로 예, 잘 작동합니다. 나는 왜 그를 그렇게 나쁘게 생각했는가? 아마도 C++11의 새벽에 비뚤어진 구현...

추신: 하지만 lanch::async 정책을 사용하는 매우 느린 async() 정책을 lanch::deferred로 바꾸면(+ 첫 번째 주기가 끝날 때 작업이 완료될 때까지 대기) 이 간단한 테스트가 시작됩니다. 30배 더 빨리 일하기 위해!!! 그것은 멀티 스레딩입니다)). 따라서 자체 제작한 쓰레드 풀을 위한 여지가 있고, 표준 쓰레드 풀보다 훨씬 빠르게 할 수 있는 것 같다.

 
Roman :

여전히 dll에 대한 프로젝트 설정에 대한 질문이 있었습니다.
컴파일러에서 자동으로 dll 종속성으로 끌어오는 사용하지 않는 함수를 제거하는 방법은 무엇입니까?

나는 이미 다른 개발 환경을 시도했고 각각은 사용하지 않는 자체 기능을 가져옵니다.
MSVS_2017은 일반적으로 자체 런타임 종속성을 가져오므로 제거할 수 없습니다.

당연하게 여기고 잊어버리거나 점수를 매기십시오.
어떻게 그리고 왜 방해합니까? 헛소리는 이웃에게 맡겨라.)
고급 언어는 프로그래머가 세부 사항에 신경 쓰지 않도록 설계되었습니다. 이것은 왕실 사업이 아닙니다. 예, 무엇이 필요한지, 무엇이 필요하지 않은지 어떻게 알 수 있습니까? 컴파일러가 더 잘 압니다.
 
Vict :

더 어려운 비동기 테스트

글쎄, 일반적으로 예, 잘 작동합니다. 나는 왜 그를 그렇게 나쁘게 생각했는가? 아마도 C++11의 새벽에 비뚤어진 구현...

추신: 하지만 lanch::async 정책을 사용하는 매우 느린 async() 정책을 lanch::deferred로 바꾸면(+ 첫 번째 주기가 끝날 때 작업이 완료될 때까지 대기) 이 간단한 테스트가 시작됩니다. 30배 빨리 일하기 위해!!! 그것은 멀티 스레딩입니다)). 따라서 자체 제작한 쓰레드 풀을 위한 여지가 있고, 표준 쓰레드 풀보다 훨씬 빠르게 할 수 있는 것 같다.

나는 그것을 끝까지 읽지 않았고 지연 플래그로 실행하도록 제안하기로 결정했습니다))))) 그러한 테스트가 더 빠를 경우 일반적으로 이 방법을 사용하는 것이 바람직하다고 생각하는 것이 논리적입니다. 왜 엄격하게 설정합니까? 제한. Git에 대한 링크에 대해 감사하다는 말을 하고 싶었습니다. 관심을 가지고 봤습니다.) 부스트가 있거나 없는 두 가지 옵션이 있다는 점이 정말 마음에 들었습니다.

로만 :

여전히 dll에 대한 프로젝트 설정에 대한 질문이 있었습니다.
컴파일러에서 자동으로 dll 종속성으로 끌어오는 사용하지 않는 함수를 제거하는 방법은 무엇입니까?

나는 이미 다른 개발 환경을 시도했고 각각은 사용하지 않는 자체 기능을 가져옵니다.
MSVS_2017은 일반적으로 자체 런타임 종속성을 가져오므로 제거할 수 없습니다.
따라서 다른 IDE를 시도했지만 사용하지 않는 기능도 가져옵니다.
그들을 제거하는 방법?

그리고 런타임 없이 어떻게? 그리고 네, 그것은 모든 곳에서 다릅니다. 아니요, 런타임 없이 찌르거나 당기지 않습니다.)))) 아직 QT로 작업하지 않았습니다. DLL의 소시지가 쭉 뻗어 있는 곳입니다.


 
Andrei Novichkov :

나는 그것을 끝까지 읽지 않았고 지연 플래그로 실행하도록 제안하기로 결정했습니다))))



지연 플래그와 함께 async()가 필요한 이유는 무엇입니까? 정말 이해가 안되는데 설명해주실 수 있나요?

 
Vict :

지연 플래그와 함께 async()가 필요한 이유는 무엇입니까? 정말 이해가 안되는데 설명해주실 수 있나요?

그리고 실제로 설명서에서 플래그에 대해 읽어보지 않으시겠습니까? https://en.cppreference.com에서 그리고 stackoverflow.com에 대한 토론이 있는 예. 나는 일반적으로 이러한 정보 소스를 사용하며, 귀하에게 조언합니다.

 
Andrei Novichkov :

그리고 실제로 설명서에서 플래그에 대해 읽어보지 않으시겠습니까? https://en.cppreference.com에서 그리고 stackoverflow.com에 대한 토론이 있는 예. 나는 일반적으로 이러한 정보 소스를 사용하며, 귀하에게 조언합니다.

MSDN. 완전한 문서. 나머지는 그냥 추가입니다. 재료.