| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3833 人关注过本帖
标题:C++11 多线程 问题
只看楼主 加入收藏
EricZ
Rank: 1
等 级:新手上路
帖 子:4
专家分:2
注 册:2016-1-23
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
C++11 多线程 问题
请问如何让线程强行挂起?
程序代码:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <future>
#include <functional>
#include <chrono>

std::mutex mt;
std::condition_variable cv;
bool _isReady = 0;
void func()
{
    std::unique_lock<std::mutex> lck(mt);
    std::cout << "func get the lock" << std::endl;
    while(!_isReady)
    {
        cv.wait(lck);
    }
    std::cout << "func lock status : " << lck.owns_lock() << std::endl;
    // lck.unlock();
    _isReady = !_isReady;
    cv.notify_all();
    // std::this_thread::yield();
    // lck.lock();
    while(!_isReady)
    {
        cv.wait(lck);
    }
    std::cout << "func get the lock the lock status : " << lck.owns_lock() << std::endl;
}
int main()
{
    std::unique_lock<std::mutex> lck(mt);
    std::cout << "main get the lock" << std::endl;
    std::thread t1(func);
    _isReady = !_isReady;
    lck.unlock();
    cv.notify_all();
    // std::this_thread::yield();
    // lck.lock();
    while(_isReady)
    {
        cv.wait(lck);
    }
    _isReady = !_isReady;
    lck.unlock();
    std::this_thread::yield();
    
    t1.join();
    return 0;
}

编译条件 g++(4.8.4) -std=c++11 -pthread ubuntu 14
我想完成一个功能就是通过对于isReady的改变来控制两个线程的进行,处理不好的就是不能完美的挂起两个进程
我发现的是 如果不解开互斥量 就不能 通过notify_all()激活另一个线程 但是如果解开了 用condition_variable的时候就要再加上,
但是搞不懂为啥再回到main里的时候 回不去了= = 感觉是因为两个线程都是挂起了,所以程序是假死了,但是不知道为什么在func()里面的notify_all()不能唤醒main里的线程
然后就是用yield()的话就会直接结束了程序,所以也是不行_(:-_|)|_
搜索更多相关主题的帖子: 如何 多线程 
2016-04-18 21:23
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
看了一遍又一遍,没看懂
描述你想实现的功能
描述当前实际现象
2016-04-18 22:34
EricZ
Rank: 1
等 级:新手上路
帖 子:4
专家分:2
注 册:2016-1-23
收藏
得分:0 
回复 2楼 rjsp
我是第一次学习多线程操作
我想实现的功能是A B两个线程,通过一个标志量来控制两个线程的运行,
比如说当标志量是1的时候A运行,B挂起;0的时候B运行A挂起
但是我只能是一开始标志量设为0,然后 B运行了,A也的确是挂起的,然后B结束的时候设置标志量为1
接着A可以运行,然后A运行完的时候设置标志量为0,然后就没有反应了
我试着改了不同的几种方式,会出现段错误,然后好像是因为unique_lock调用了unlock() 然后在调用wait之前没有再次lock的原因
我实验了几次感觉是因为wait的问题,在发出notify的时候,另一个线程因为某些原因不能正常工作所以就又挂起了?然后发出notify的线程又调用了wait
然后两个线程都保持了挂起状态 导致了程序的假死?
是这个原因吗?
另外还想问一下怎么调试多线程的程序_(:-_|)|_用IDE单步飞到各种库里T_T
2016-04-18 23:20
EricZ
Rank: 1
等 级:新手上路
帖 子:4
专家分:2
注 册:2016-1-23
收藏
得分:0 
回复 2楼 rjsp
终于弄懂了,因为没有在调用notify_all之前解锁互斥量,所以另一个线程不能成功的唤醒,所以导致了两者同时挂起
还有一个问题是因为调用wait之前必须unique_lock是锁住的。
话说小于三个字符的限制什么鬼_(:-_|)|_
P。S。如果要结贴的话是点右上角吗?
2016-04-19 00:13
快速回复:C++11 多线程 问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025210 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved