I want to write a program use 3 threads to print 1-100 in turns using C++11 condition_variable, but dead lock confused me, here are my code:
the tmp.cpp is:
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
std::condition_variable cv12;
std::condition_variable cv23;
std::condition_variable cv31;
std::mutex mtx;
void Print(int i) {
  while (i <= 100) {
    if (i % 3 == 1) {
      {
        std::unique_lock<std::mutex> l(mtx);
        cv31.wait(l);
        std::cout << i << std::endl;
      }
      cv12.notify_all();
    } else if (i % 3 == 2) {
      {
        std::unique_lock<std::mutex> l(mtx);
        cv12.wait(l);
        std::cout << i << std::endl;
      }
      cv23.notify_all();
    } else if (i % 3 == 0) {
      {
        std::unique_lock<std::mutex> l(mtx);
        cv23.wait(l);
        std::cout << i << std::endl;
      }
      cv31.notify_all();
    }
    i += 3;
  }
}
int main() {
  std::thread t1(Print, 1);
  std::thread t2(Print, 2);
  std::thread t3(Print, 3);
  cv31.notify_all();
  t1.join();
  t2.join();
  t3.join();
  return 0;
}
the run command is:
$ g++ -g -o tmp tmp.cpp  && ./tmp
But the output sometimes could just and stops.
╰─$ ./tmp                
1
2
    
When I ask GPT or Claud, they give me no advice, that imply my code may correct, when I use gdb to debug for the deadlock, but this program always run correctly in gdb, which dead lock never occurs.
I refer to the ways of condition varible wait usage, may should add a Predicate, but I don't want to write more global varible to handle this, and I find the Predicate is optional, so I don't know where is the bug in my code?
Aucun commentaire:
Enregistrer un commentaire