std :: atomic <bool>在主线程中修改,但在其他线程中保持不变

时间:2016-05-24 06:41:28

标签: c++ multithreading c++11 stdatomic

我正在尝试使用std :: atomic协同停止我的国际象棋AI中的一些线程。当我调用StopPondering()时,我无法弄清楚为什么我的线程会继续运行。如果我在StopPondering中断,我看到Searching设置正确,但是如果我在两个线程中的任何一个中断,它的值仍然是真的。  我在Windows 8.1上使用VS 2013 代码的相关子集如下。

AI0.h

  @Override
    public void onBindViewHolder(final ViewHolder viewHolder, int i) {

        final Reciept items = aBillArr.get(i);

        viewHolder.textDate.setText(items.getrecptDate());
        viewHolder.txtVBillNo.setText(items.getBillNo() + "");
        viewHolder.textVamount.setText(items.getOrdAmnt() + "");
        viewHolder.textVpendingAmnt.setText(items.getPendingAmnt());

        int enteredAmnt,paidAmount = 0;
        String billNo;

        enteredAmnt = OrderApplication.ENTERED_BILL_AMOUNT;

        Log.e("Prachi","Entered Amount" +enteredAmnt);

        if(enteredAmnt != 0){

            for(int j = 0 ; j < aBillArr.size() ; j ++){

                int pendingAmount = Integer.parseInt(aBillArr.get(j).getPendingAmnt());
              //  billNo = Integer.parseInt(items.getbillNo());

                billNo = aBillArr.get(j).getBillNo();

                if(enteredAmnt > pendingAmount){

                    enteredAmnt = enteredAmnt - pendingAmount ;
                    paidAmount = paidAmount + pendingAmount ;
                    pendingAmount = 0 ;
                    db.updateReceipt(billNo,pendingAmount,paidAmount);

                    viewHolder.textVpendingAmnt.setText(items.getPendingAmnt());

                    Log.e("Prachi","Bill No" +billNo);
                    Log.e("Prachi","Pending Amount" +pendingAmount);
                    Log.e("Prachi","Paid Amount" +paidAmount);

                }
                else if(enteredAmnt < pendingAmount){

                    enteredAmnt = enteredAmnt - pendingAmount ;
                    paidAmount = paidAmount + pendingAmount ;
                    pendingAmount = abs(pendingAmount - enteredAmnt) ;
                    db.updateReceipt(billNo,pendingAmount,paidAmount);

                    viewHolder.textVpendingAmnt.setText(items.getPendingAmnt());

                }
                else if( enteredAmnt == pendingAmount){

                    enteredAmnt = enteredAmnt - pendingAmount ;
                    paidAmount = paidAmount + pendingAmount ;
                    pendingAmount = 0;
                    db.updateReceipt(billNo,pendingAmount,paidAmount);

                    viewHolder.textVpendingAmnt.setText(items.getPendingAmnt());
                }
            }
        }
    }

AI0.cpp

#pragma once
#include "AI.h"
#include <thread>
#include <atomic>

class AI0 : public AI
{
public:
    virtual void Ponder(Game game, U8 depth = 0) override;
    virtual void StopPondering() override;
private:

    std::thread* SearchThread;
    std::thread* InfoThread;

    std::atomic<bool> Searching;

    void search(GameState state);
    void SendInfo();
}

我为我不一致的大写道歉。

--------- --------- EDIT

问题解决了。我愚蠢地创建了多个AI0实例,并且,正如一些人确实怀疑的那样,我没有在产生线程的同一个实例上调用StopPondering(),这确实是内存泄漏。我现在只有一个AI0单例,一切都按预期工作。抱歉失败。

0 个答案:

没有答案