c++的多线程编程问题

代码如下:voidprocess_a(sth_sth){...}voidprocess_b(sth_sth){...}classmultithread{private:v... 代码如下:

void process_a(sth _sth){
...
}
void process_b(sth _sth){
...
}

class multithread {
private:
vector<sth> v_sth;
int idx_a = 0;
int idx_b = 0;
public:
multithread(){
v_sth.resize(100);
}
void a(){
process_a(v_sth[idx_a]);
idx_a++;
}
void b(){
if(idx_b < idx_a){
process_b(v_sth[idx_b]);
idx_b++;
}
else{
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
};

void main(){
multithread m;
std::thread thread_a(&multithread::a(), m);
std::thread thread_b(&multithread::b(), m);
thread_a.join();
thread_b.join();

return;
}

我认为这种情况下两个线程不会同时处理v_sth中的同一个元素,因此不需要加mutex等进行保护;然而实际运行的时候,线程thread_b执行函数b()里面“ if(idx_b < idx_a)”这一行无法读取到idx_a当前的值,该idx_a总是维持初期值0,导致b()中对v_sth的处理无法进行。请问如何解决?
没缩进看着麻烦,补个图……顺带修改一下,代码里启动thread那两行里函数a和b后面没有括号囧。
展开
 我来答
若以下回答无法解决问题,邀请你更新回答
捣蒜大师Edison
2018-08-12 · TA获得超过2962个赞
知道大有可为答主
回答量:3825
采纳率:77%
帮助的人:1253万
展开全部
//你可以试试把a声明
int idx_a=0;
//改为
std::atomic_int idx_a=0;
追问
试了下没效果,idx_a还是一直都是0;而且发现v_sth也没有同步更新,所有的元素都是初期值,仿佛两个线程调用的是两个不同的对象一样……是不是建立线程的方法不对?不应该全都写进一个类里么?
追答
你这个能编译成功吗?那个a b不是应该是静态函数么。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式