我正在尝试使用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单例,一切都按预期工作。抱歉失败。