본문 바로가기
프로그래밍/C++

C++] 스레드의 사용량을 알아보자!!(Concurrency Visualizer)

by Hwan2 2020. 11. 8.
728x90
반응형

1. 소개

프로그래밍을 하면서 스레드가 과연 잘 사용되고 있는지?

혹시 어딘가 block되어서 제대로 일을 못하고 있는지?

mutex구간이 많아서 컨텐션이 많이 발생되는지??

이럴때 프로그램(프로세스)을 돌리면서 실시간 데이터 정보를 받아 각 스레드의 사용량을 보여주는 프로그램이 있습니다.

Visual studio의 확장 프로그램인 Concurrency Visualizer for Visual studio 프로그램 입니다.

저는 Visual studio 2019 버전을 사용했습니다.

2. 설치 방법

1. 



2.



3.

설치가 완료되면 visual studio를 껏다 켜주세요. 그럼 마저 설치가 된 후 프로그램을 실행할 수 있습니다.

3. 사용 방법

#include <vector>
#include <iostream>
#include <chrono>
#include <thread>
#include <memory>
#include <mutex>

using namespace std;

const int MaxCount = 15000000;
const int ThreadCount = 4;

bool IsPrimeNumber(int number)
{
    if (number == 1)
        return false;
    if (number == 2 || number == 3)
        return true;
    for (int i = 2; i < number - 1; i++)
    {
        if ((number % i) == 0)
            return false;
    }
    return true;
}

void PrintNumbers(const vector<int>& primes)
{
    for (int v : primes)
    {
        cout << v << endl;
    }
}

int main()
{
    // 각 스레드는 여기서 값을 꺼내온다.
    int num = 1;
    recursive_mutex num_mutex;

    vector<int> primes;
    recursive_mutex primes_mutex;

    auto t0 = chrono::system_clock::now();

    // 작동할 워커 스레드
    vector<shared_ptr<thread> > threads;

    for (int i = 0; i < ThreadCount; i++)
    {
        shared_ptr<thread> thread1(new thread([&]() {
            // 각 스레드의 메인 함수.
            // 값을 가져올 수 있으면 루프를 돈다.
            while (true)
            {
                int n;
                {
                    lock_guard<recursive_mutex> num_lock(num_mutex);
                    n = num;
                    num++;
                }
                if (n >= MaxCount)
                    break;

                if (IsPrimeNumber(n))
                {
                    lock_guard<recursive_mutex> primes_lock(primes_mutex);
                    primes.push_back(n);
                }
            }
            }));
        // 스레드 객체를 일단 갖고 있는다.
        threads.push_back(thread1);
    }

    // 모든 스레드가 일을 마칠 때까지 기다린다.
    for (auto thread : threads)
    {
        thread->join();
    }
    // 끝

    auto t1 = chrono::system_clock::now();

    auto duration = chrono::duration_cast<chrono::milliseconds>(t1 - t0).count();
    cout << "Took " << duration << " milliseconds." << endl;

    //PrintNumbers(primes);
    return 0;
}


해당 코드를 실행시켜 주세요.

해당 코드는 imays76 github에 있는 코드입니다.

URL : https://github.com/imays76/GameServerBook/tree/master/chapter_1/prime_number_multithreaded



2.  분석 -> Concurrency 시각화 -> 프로세스에 연결



3. 프로세스 연결


현재 저는 Project3이라는 이름의 프로젝트로 해당 코드를 실행했기 때문에 Project3 프로세스와 연결시켜 줍니다.



4. 데이터 수집

이런 화면이 뜰겁니다. 5 ~ 10초정도 수집하진 후 가운데 있는 컬렉션 중지를 눌러주세요.

(Visual studio를 검은색 테마를 썻는데 글씨가 잘 안보여서... 잠깐 광원으로 테마를 바꿨어요....)


5. 데이터 확인


스레드 항목을 눌러서 보면 제 컴퓨터는 쓰레드를 98%활용하고 있다고 나옵니다. 

굉장히 잘 활용하고 있죠.


4. 마치며

재미있게 갖고 노시면 될 것 같습니다.!!...



반응형

댓글


스킨편집 -> html 편집에서