소켓을 발견 한 이래로 스레딩에 대해 배우는 데 신경 쓰고 싶지 않았기 때문에 비 블로킹 변형을 사용했습니다. 그 이후로 나는 스레딩에 대한 더 많은 경험을 쌓았으며, 나 자신에게 묻기 시작했습니다. 왜 그것을 소켓 용으로 사용했을까요?소켓에 스레딩이 사용되는 이유는 무엇입니까?
스레딩의 큰 전제는 그들이 자신의 데이터 집합에서 작업하는 경우에만 의미가있는 것처럼 보입니다.
if(!hashmap.hasKey("bar"))
{
dostuff // <-- meanwhile another thread inserts "bar" into hashmap
hashmap[bar] = "foo"; // <-- our premise that the key didn't exist
// (likely to avoid overwriting something) is now invalid
}
지금 암호를 원격 IP를 매핑하는 해시 맵을 상상 : 당신은 동일한 데이터 세트 작업을 두 개의 스레드가 있으면, 당신은 다음과 같은 상황이있을 것이다. 내가 어디로 가는지 볼 수있어. 제 말은 확실히 그러한 스레드 상호 작용이 잘못 될 가능성은 매우 적지 만 여전히 존재합니다. 그리고 프로그램을 안전하게 유지하려면 모든 우발적 사건을 설명해야합니다. 단순한 단일 스레드 워크 플로우와 비교할 때 설계에 들어가는 노력이 크게 증가합니다.
별도의 데이터 집합이나 스레딩을 사용하도록 명시 적으로 최적화 된 프로그램에서 스레딩이 얼마나 효과적인지 완전히 볼 수 있습니다. 그러나 프로그래머가 작업하고 안전한 프로그램을 출하하는 것과 관련된 "일반"의 경우, 폴링에 대한 스레딩을 사용할 이유가 없습니다.
"분리 된 스레드"접근법이 매우 널리 퍼져있는 것처럼 보일 수 있습니다. 아마도 나는 뭔가를 간과하고있을 것입니다. 나에게 계몽해라! 컴퓨터에 두 개 이상의 CPU 코어를 가지고 있기 때문에, 당신은 만들고 싶어 :
좋은 이유 : :)
스레드를 사용하면 서버에서 두 가지 다른 연결을 동시에 처리 할 수 있습니다. 그렇지 않으면 순차적으로 처리해야합니다. – Gray
한 번에 하나의 HTTP 요청 만 제공 할 수있는 웹 서버를 상상해보십시오. treading을 사용하면 웹 서버가 더 많은 요청을 동시에 처리 할 수 있습니다. –
예, HTTP와 같은 서비스는 관련성이없는 요청을 더 많이 또는 덜 제공 할 수 있다는 큰 이점이 있습니다. 동일한 데이터 세트를 사용하는 곳에서는 트랜잭션 모델이 내장되어있어 스레드 안전성이 보장되는 데이터베이스를 사용합니다. 그러나 이것은 단지 하나의 응용 프로그램 유형입니다. – cib