FORTRAN 및 BASIC의 초기에는 기본적으로 모든 프로그램이 GOTO 문으로 작성되었습니다. 결과는 스파게티 코드 였고 솔루션은 구조화 된 프로그래밍이었습니다.
마찬가지로 포인터는 프로그램의 특성을 제어하기 어려울 수 있습니다. C ++은 많은 포인터로 시작했지만 참조를 사용하는 것이 좋습니다. STL과 같은 라이브러리는 일부 종속성을 줄일 수 있습니다. 더 나은 특성을 가진 스마트 포인터를 만드는 관용구도 있으며 일부 C ++ 버전에서는 참조 및 관리 코드를 허용합니다.
상속 및 다형성과 같은 프로그래밍 방법은 많은 배후에 포인터를 사용합니다 (구조화 된 프로그래밍은 분기 명령어로 채워진 코드를 생성하는 것과 마찬가지로). Java와 같은 언어는 포인터를 제거하고 가비지 수집을 사용하여 프로그래머에 의존하지 않고 동적으로 할당 된 데이터를 관리하여 모든 새 문과 삭제 문을 일치시킵니다.
필자는 세마포어를 사용하지 않는 멀티 프로세스 및 멀티 스레드 프로그래밍의 예를 보았습니다. 그들은 같은 이름을 다른 이름으로 사용하거나 동시 사용으로부터 자원을 보호하는 새로운 방법을 가지고 있습니까?
예를 들어, 멀티 코어 프로세서를 사용한 멀티 스레드 프로그래밍 시스템의 특정 예는 OpenMP입니다. 환경에 포함되지 않는 세마포어를 사용하지 않고 다음과 같이 중요한 영역을 나타냅니다.
th_id = omp_get_thread_num();
#pragma omp critical
{
cout << "Hello World from thread " << th_id << '\n';
}
이 예제는 http://en.wikipedia.org/wiki/OpenMP 에서 발췌 한 것입니다.
또는 wait () 및 signal () 함수를 사용하여 세마포어를 사용하여 서로 비슷한 스레드를 보호하는 방법은 다음과 같습니다.
wait(sem);
th_id = get_thread_num();
cout << "Hello World from thread " << th_id << '\n';
signal(sem);
이 예제에서는 상황이 매우 간단하고 간단한 검토만으로 wait () 및 signal () 호출이 일치하고 많은 동시성이 있어도 스레드 안전성이 제공됨을 보여주기에 충분합니다. 그러나 다른 알고리즘은 더 복잡하며 여러 스레드에서 호출 할 수있는 복잡한 조건을 가진 여러 함수에 걸쳐 여러 세마포어 (바이너리 및 카운팅)를 사용합니다. 교착 상태를 만들거나 스레드를 안전하게 만들지 못하는 결과는 관리하기 어려울 수 있습니다.
OpenMP와 같은 이러한 시스템이 세마포 문제를 제거합니까?
그들은 다른 곳으로 문제를 옮깁니 까?
더 이상 세마포어를 사용하지 않도록 알고리즘을 사용하여 좋아하는 세마포어를 변환하려면 어떻게해야합니까?