다중 스레드 프로그램이 대기 상태에서 멈 춥니 다.

원망하다

다음 코드가 있습니다. 간단한 다중 스레드 생산자 소비자 문제를 작성하기 위해 C ++ 11 스레드를 사용하고 있습니다.

class W
{
public:
    explicit W();
    void p();
    void c();
private:
    std::deque<std::uint64_t> q;
    std::shared_ptr<std::mutex> m;
    std::shared_ptr<std::condition_variable> cvQEmpty;
    std::shared_ptr<std::condition_variable> cvQFull;
    const std::size_t queue_size;
};

W::W()
: m(std::make_shared<std::mutex>()), 
cvQEmpty(std::make_shared<std::condition_variable>()),
cvQFull(std::make_shared<std::condition_variable>()),
queue_size(3)  
{
}

void
W::p()
{
    while(1)    
    {
        std::unique_lock<std::mutex> lk(*m.get());
        if (q.size() >= queue_size)
        {
            cvQFull->wait(lk, [this] { return q.size() < queue_size; });
        }
        q.push_back(q.size());
        std::cout << "Pushed " << q[q.size() - 1] << std::endl;
        lk.unlock();
        cvQEmpty->notify_one();
    }
}

void
W::c()
{
  while (1)
  {
    std::unique_lock<std::mutex> lk(*m.get());
    if (q.empty())
    {
        cvQEmpty->wait(lk, [this] { return !q.empty(); });
    }
    while(!q.empty())
    {
      const std::uint64_t val = q[0];
      std::cout << "Output : " << val << std::endl;
      q.pop_back();
    }
    lk.unlock();
    cvQFull->notify_one();
  }
}

void 
foo()
{
    W w;
    std::thread p(&W::p, w);
    std::thread c(&W::c, w);
    c.join();
    p.join();
} 

두 스레드 모두 조건 대기시 교착 상태가됩니다.

내가 어디로 잘못 가고 있는지 알려주세요. 프로그램은 경고없이 잘 컴파일됩니다.

사용 된 컴파일러 : g ++-5.8

SergeyA

아주 간단합니다. 당신은있다 복사 하여 w복사 생성자를 호출, 두 스레드 인수를. 이러한 스레드는 두 개의 독립 대기열을 사용합니다!

해결책 :

  • 큐를 shared_ptr뮤텍스처럼 만드세요
  • (더 나은) 당신의 주장을 std::ref.

(참고로, explicit W()아무것도 제공하지 않으며 구문 노이즈 일뿐입니다)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Gradle이 transformClassesWithPreDexForRelease에서 멈 춥니 다.

분류에서Dev

Visual Studio 2017이 "템플릿 초기화 중 ..."에서 멈 춥니 다.

분류에서Dev

JPanel에서 그림을 그리려고하면 응용 프로그램이 멈 춥니 다.

분류에서Dev

6 명 이상의 사용자에 대해 값을 입력하면 프로그램이 작동을 멈 춥니 다.

분류에서Dev

scanf ()에서 변수에 대한 참조를 제외하면 프로그램이 작동을 멈 춥니 다. 왜 이런거야?

분류에서Dev

git clone이 "연결 확인 중"에서 멈 춥니 다.

분류에서Dev

테스트 장치에 IPA를 설치할 때 앱이 "대기 중 ..."으로 멈 춥니 다. 어떻게 해결합니까?

분류에서Dev

Dalekjs open () 메서드가 무작위로 멈 춥니 다.

분류에서Dev

백그라운드에서 재생하면 음악이 멈 춥니 다. 서비스로 사용하고 싶지 않습니다 .. 대안은 무엇입니까?

분류에서Dev

Open CV traincascade는 적중률이 1이고 잘못된 경보가 0 인 상태에서 멈 춥니 다.

분류에서Dev

진행중인 다른 설치가 없는데도 설치 프로그램이 "다른 설치가 완료되기를 기다리는 중"에서 멈 춥니 다.

분류에서Dev

클래스 멤버 함수가 실행되면 프로그램이 작동을 멈 춥니 다.

분류에서Dev

NHibernate 데이터가 다중 스레드 응용 프로그램에서 동기화되지 않았습니다.

분류에서Dev

Hangfire ContinueWithJob이 대기 중 상태에서 멈췄지만 상위 작업은 성공했습니다.

분류에서Dev

URL에 JSESSIONID가 나타난 후 웹 응용 프로그램이 작동을 멈 춥니 다.

분류에서Dev

프로그램을 디버그하려고 할 때 rascal이 멈 춥니 다.

분류에서Dev

프로그램을 디버그하려고 할 때 rascal이 멈 춥니 다.

분류에서Dev

로그인 화면에서 마우스가 작동을 멈 춥니 다.

분류에서Dev

readObject ()가 프로그램을 멈 춥니 다.

분류에서Dev

UIPageViewController가 SwiftUI에서 한 번 스 와이프 한 후 작동을 멈 춥니 다.

분류에서Dev

런처가 고해상도 디스플레이에서 우분투 14.10을 멈 춥니 다.

분류에서Dev

ASP VB가 동적 컨트롤, 뷰 상태 및 포스트 백에서 멈 춥니 다. 다시 궤도에 오르는 데 도움이 필요합니다.

분류에서Dev

자바 스크립트 프로그램이 큰 값에 대해 작동을 멈췄습니다.

분류에서Dev

Fedora가 systemd로 부팅하기 전에 검은 화면에서 멈 춥니 다.

분류에서Dev

Windows에 로그인 할 때 키보드가 잠시 작동을 멈 춥니 다.

분류에서Dev

TextureAtlas에 스프라이트가 너무 많으면 게임이 멈 춥니 다.

분류에서Dev

as3 반대 이동 키를 누르면 플레이어가 멈 춥니 다.

분류에서Dev

일시 중단시 시스템이 즉시 멈 춥니 다. 어디에서 조사해야합니까?

분류에서Dev

vim8을 빌드 할 때 checkinstall이 "임시 디렉토리에 파일 복사 중 ..."에서 멈 춥니 다.

Related 관련 기사

  1. 1

    Gradle이 transformClassesWithPreDexForRelease에서 멈 춥니 다.

  2. 2

    Visual Studio 2017이 "템플릿 초기화 중 ..."에서 멈 춥니 다.

  3. 3

    JPanel에서 그림을 그리려고하면 응용 프로그램이 멈 춥니 다.

  4. 4

    6 명 이상의 사용자에 대해 값을 입력하면 프로그램이 작동을 멈 춥니 다.

  5. 5

    scanf ()에서 변수에 대한 참조를 제외하면 프로그램이 작동을 멈 춥니 다. 왜 이런거야?

  6. 6

    git clone이 "연결 확인 중"에서 멈 춥니 다.

  7. 7

    테스트 장치에 IPA를 설치할 때 앱이 "대기 중 ..."으로 멈 춥니 다. 어떻게 해결합니까?

  8. 8

    Dalekjs open () 메서드가 무작위로 멈 춥니 다.

  9. 9

    백그라운드에서 재생하면 음악이 멈 춥니 다. 서비스로 사용하고 싶지 않습니다 .. 대안은 무엇입니까?

  10. 10

    Open CV traincascade는 적중률이 1이고 잘못된 경보가 0 인 상태에서 멈 춥니 다.

  11. 11

    진행중인 다른 설치가 없는데도 설치 프로그램이 "다른 설치가 완료되기를 기다리는 중"에서 멈 춥니 다.

  12. 12

    클래스 멤버 함수가 실행되면 프로그램이 작동을 멈 춥니 다.

  13. 13

    NHibernate 데이터가 다중 스레드 응용 프로그램에서 동기화되지 않았습니다.

  14. 14

    Hangfire ContinueWithJob이 대기 중 상태에서 멈췄지만 상위 작업은 성공했습니다.

  15. 15

    URL에 JSESSIONID가 나타난 후 웹 응용 프로그램이 작동을 멈 춥니 다.

  16. 16

    프로그램을 디버그하려고 할 때 rascal이 멈 춥니 다.

  17. 17

    프로그램을 디버그하려고 할 때 rascal이 멈 춥니 다.

  18. 18

    로그인 화면에서 마우스가 작동을 멈 춥니 다.

  19. 19

    readObject ()가 프로그램을 멈 춥니 다.

  20. 20

    UIPageViewController가 SwiftUI에서 한 번 스 와이프 한 후 작동을 멈 춥니 다.

  21. 21

    런처가 고해상도 디스플레이에서 우분투 14.10을 멈 춥니 다.

  22. 22

    ASP VB가 동적 컨트롤, 뷰 상태 및 포스트 백에서 멈 춥니 다. 다시 궤도에 오르는 데 도움이 필요합니다.

  23. 23

    자바 스크립트 프로그램이 큰 값에 대해 작동을 멈췄습니다.

  24. 24

    Fedora가 systemd로 부팅하기 전에 검은 화면에서 멈 춥니 다.

  25. 25

    Windows에 로그인 할 때 키보드가 잠시 작동을 멈 춥니 다.

  26. 26

    TextureAtlas에 스프라이트가 너무 많으면 게임이 멈 춥니 다.

  27. 27

    as3 반대 이동 키를 누르면 플레이어가 멈 춥니 다.

  28. 28

    일시 중단시 시스템이 즉시 멈 춥니 다. 어디에서 조사해야합니까?

  29. 29

    vim8을 빌드 할 때 checkinstall이 "임시 디렉토리에 파일 복사 중 ..."에서 멈 춥니 다.

뜨겁다태그

보관