2023.10.11 - [이론/네트워크] - 1 - 1) 멀티스레딩 개요
어떤 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위
여러 프로세스와 여러 스레드를 동시에 실행하는 운영체제는 여러 프로세스와 프로세스 안에 있는 스레드들을 일정 시간마다 번갈아 가면서 실행
기본적으로 기계어 명령 단위로 발생
스레드를 실행하다가 다른 스레드를 마다 실행하는 과정
CPU 개수와 스레드 개수가 같거나 스레드 개수가더 적으면 컨텍스트 스위치가 발생하지 않음
※ 과정의 연산량이 많아 동시에 실행하는 스레드가 여럿이라 해도 컨텍스트 스위치가 많으면 비효율적
비고 )
예상하지 못한 결과 발생을 없애기 위해 다른 스레드가 절대 건드리지 못하게 하는 "원자성", 원자성을 유지해야 변수의 상태가 항상 같은 상태임을 뜻하는 "일관성" 을 유지해야함
-> 해결 방법의 통칭 : 동기화
상호 배제(mutual exclusion)의 줄인 말
#include <vector>
#include <iostream>
#include <thread>
#include <memory>
#include <mutex>
using namespace std;
const int MaxCount = 150000;
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 Main()
{
int num = 1;
recursive_mutex num_mutex;
vector<int> primes;
recursive_mutex primes_mutex;
vector<shared_ptr<thread>> threads;
for(int i = 0; i < ThreadCount; i++)
{
shared_ptr<thread> thread(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(thread);
}
for(auto thread : threads)
{
thread->join();
}
CPU의 수 만큼 스레드가 늘어나도 프로그램의 실행 시간은 순수하게 코어의 수가 늘어난 만큼 빨라지지 않음.
멀티스레드로 작동하더라도 메모리에 접근하는 메모리 바운드 시간 동안은 CPU 개수보다 더 작은 CPU가 처리.
1 - 3) UDP/TCP 네트워킹 (0) | 2024.05.17 |
---|---|
1 - 1) 멀티스레딩 개요 (1) | 2023.10.11 |