Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

利用原子变量的生产者消费者示例代码无法运行。 #4

Open
aoaforever opened this issue Aug 3, 2022 · 2 comments
Open

Comments

@aoaforever
Copy link

当我运行下面的代码时,程序无法得到任何输出,似乎是卡在了某个地方,请问是哪里出错了呢。
源出处

#include <iostream>
#include <thread>
#include <atomic>
#include <list>
#include <iostream>
using namespace std;


class Solution {
public:
  Solution()
  : state_{State::READ},
    trd_{[this]{
        this->customer();
            }
        }
    {     }

    void producer(int val)
    {
      while(state_.load(std::memory_order_acquire) == State::READ);

      task_.push_back(val);
      state_.store(State::WRITE, std::memory_order_release);
    }

    void customer() 
    { 
      while(state_.load(std::memory_order_acquire) == State::WRITE);
      if(!task_.empty()) { 
        int val = task_.front();
        cout<<val<<endl;
        task_.pop_front();
      }

      state_.store(State::READ, std::memory_order_release);
    }
private:
  enum class State {READ, WRITE};

  std::atomic<State> state_;
  std::thread        trd_;
  std::list<int>     task_;
};

int main(){
    Solution s;
    s.producer(2);
    s.producer(3);
    s.producer(1);
    return 0;
}
@ROBINwan999
Copy link

打印输出试试

@Norman-h
Copy link

首先 trd_ 线程只会调用 customer 函数一次,会错过运行的时机。Show you code

class Solution
{
public:
    Solution()
        : state_{State::READ},
          trd_{[this]
               {
                while (1) {
                    this->customer();
                }
                //    this->customer();
               }}
    {
    }

    ~Solution()
    {
        if (trd_.joinable()) {
            trd_.join();
        }
    }

    void producer(int val)
    {
        while (state_.load(std::memory_order_acquire) != State::READ) {
            std::this_thread::sleep_for(std::chrono::milliseconds(1));
        }

        task_.push_back(val);
        state_.store(State::WRITE, std::memory_order_release);
    }

    void customer()
    {
        while (state_.load(std::memory_order_acquire) != State::WRITE) {
            std::this_thread::sleep_for(std::chrono::milliseconds(1));
        }
        if (!task_.empty())
        {
            int val = task_.front();
            cout << val << endl;
            task_.pop_front();
        }
        state_.store(State::READ, std::memory_order_release);
    }

private:
    enum class State
    {
        READ,
        WRITE
    };

    std::atomic<State> state_;
    std::thread trd_;
    std::list<int> task_;
};

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants