2012-06-13 4 views
2

pthreads를 사용하여 나의 목적에 맞는 사용자 정의 된 스레드 풀을 작성하려고하는데, pthreads를 처음 사용합니다. 나는 온라인으로 (POSIX threads programmingLinux Tutorial Posix Threads) 자습서를 읽고 그들은 매우 도움이되었다,하지만 난 여전히 뮤텍스 및 조건 변수에 대한 몇 가지 (어쩌면 바보) 의심이 :pthreads를 사용하는 적절한 스레드 풀

  1. 뮤텍스의 범위는 무엇입니까? 전역 뮤텍스가 모든 전역 변수를 잠그면 한 번에 하나의 스레드 만 액세스 할 수 있습니까? 두 개의 전역 뮤텍스가 있다면 동일한 변수 세트를 잠글까요? 클래스 또는 함수 내부에서 선언 된 뮤텍스는 무엇입니까? 잠금/잠금 해제하면 어떻게됩니까?
  2. 방금 ​​전역 변수를 읽고 전혀 수정하지 않을 계획이라면 여전히 뮤텍스 잠금을 사용해야합니까?
  3. 내가 맞으면 어떤 조건에서 잠자기 (또는 pthread_cond_wait()을 사용하여 차단) 된 다른 스레드를 깨우기 위해 조건 변수가 사용됩니다. 수면 스레드에 대한 깨우기 호출은 다른 스레드의 pthread_cond_signal() 또는 pthread_cond_broadcast()에 의해 제공됩니다. 일부 또는 모든 스레드가 작업을 수행하고 다음 작업이 사용 가능할 때까지 대기하도록 제어 흐름이 어떻게 발생합니까? 특히 4 개의 스레드가있는 시나리오에 관심이 있습니다.
  4. 특정 프로세서 코어가 생성되기 전에 스레드의 선호도를 설정하여 (원하는 코어에서 실행을 시작하고 생성 후 코어가 이동하지 않도록) 방법이 있습니까?

질문이 어리석은 경우 미안하지만 말했듯이 나는 새로운 것입니다. 모든 도움, 의견, 코드 또는 좋은 리소스에 대한 포인터가 인정됩니다. 당신의 도움에 미리 감사드립니다.

답변

1

많은 질문이 있습니다. 몇 가지 대답.

(1a) 뮤텍스의 범위는 무엇이든지 프로그램하는 것입니다. 그런 의미에서 다른 종류의 변수와 다르지 않습니다.

(1b) 전역 뮤텍스는 보호를 위해 프로그램하는 변수를 보호합니다. 나는 당신의 다른 질문들에서 근본적인 오해가있을 것이라고 생각합니다. 뮤텍스에 관해서는 이상한 것이 없습니다. 하나만 선언하고 "Ok, this variables"라고 말할 수는 없습니다. 코드에 뮤텍스를 통합해야합니다. 따라서 변수 X를 사용하는 두 개의 함수가 있고 변수에 대한 변경 사항 주위에 뮤텍스 잠금/잠금 해제를 수행하고 다른 함수가 뮤텍스가 실제로 존재하지 않는다고 완전히 무시하면 아무 것도 보호하지 않습니다. 내가 생각할 수있는 가장 좋은 예는 자문 파일 잠금이다. 하나의 프로그램이 사용할 수 있지만 다른 프로그램이 잠금을 해제하지 않으면 잠글 수 없다.

(1c) 원칙적으로 동일한 데이터를 잠그는 다중 뮤텍스를 사용하지 마십시오. 문제에 대한 초대장입니다. 다시 뮤텍스의 사용은 프로그램 된 협력에 달려있다. 함수 A가 데이터 B를 뮤텍스 C로 보호하고 함수 D가 뮤텍스 E로 데이터 B를 보호한다면 데이터 B는 전혀 보호되지 않습니다. 함수 A는 뮤텍스 C에서 잠금을 유지할 수 있지만 함수 D는 아무런주의를 기울이지 않으므로 데이터 B를 그냥 덮어 씁니다.

(1d) 기본 범위 지정 규칙이 적용됩니다.

(2) 아니오. 변수가 스레드간에 불일치하게 만드는 방식으로 변경되지 않으면 변수를 잠그지 않아도됩니다.

(3) 이에 대한 자세한 답변이 있으므로 여기를 클릭하십시오. 조금만 둘러보세요.

(4) 아닙니다.

+0

답변을 주셔서 감사합니다. 특히 (1b), 오해가있었습니다. :) – Chatter

+0

다른 사람들과 마찬가지로 여러 사람 중 첫 번째 사람이됩니다. 머리를 감싸기 전에 생각과 연습과 실수가 필요하며 심지어 뱀 비트를 얻는 것도 쉽습니다. – Duck