이것은 다중 스레드 프로그래밍 측면에서 기본적인 질문 일 수 있지만 모든 동시 데이터 구조없이 다음을 수행하고자합니다. 스택의 상단을 인쇄 출력은 다음과 같이보고되도록 튀어 나오게 각 스레드std :: stack을 동시에 처리하는 올바른 방법
class A
{
std::stack<int> s;
public:
A()
{
s.push(7); s.push(6); s.push(5); s.push(4); s.push(3); s.push(2); s.push(1);
}
void process(int tid)
{
while (!s.empty())
{
std::unique_lock<std::mutex> lck(m);
std::cout << tid << " --> " << s.top() << '\n';
cv.wait(lck);
s.pop();
cv.notify_all();
lck.unlock();
}
}
std::mutex m;
std::condition_variable cv;
};
int main()
{
A a;
std::thread t1(&A::process, &a, 1);
std::thread t2(&A::process, &a, 2);
t1.join();
t2.join();
}
내가 원하는 :
1 --> 1
2 --> 2
1 --> 3
2 --> 4
...
그래서 단 1 스레드가 입력해야 코드를 살펴 보자 while 본문을 실행하고 하나의 반복 만 실행하십시오.
는하지만 그 대신 항상 출력 :
1 --> 1
2 --> 1
다음은 무한히 나는이 어떻게 할 수있는
대기?
현재 솔루션에 어떤 문제가 있습니까?
이것이 유일한 문제인지는 모르겠지만 절대로 루프 나 람다없이 조건 변수를 기다려서는 안됩니다. 아, 조건 변수가 일종의 세마포어라고 생각하는 것 같습니다. 또는 somesuch. – Yakk
@ Yakk 나는 약간의 동기화를 제공하기 위해 조건부 변수를 사용하려고 생각했다. 따라서 루프의 1 반복 만 스레드에 의해 실행된다. – ampawd