小编Jam*_*mes的帖子

std :: promise <T>是线程安全的吗?

它是安全的,就像在的情况下,std::mutexstd::promise<T>被提出mutable,或者它取决于T?如:

using Data = std::tuple<bool, int, int>;

struct X {

    std::future<Data> prepare() const {
        return m_promise.get_future();
    }

    void asyncHandler(int a, int b) const {
        m_promise.set_value({true, a, b});
    }

    void cancel() const {
        m_promise.set_value({false, 0, 0});
    }

    mutable std::promise<Data> m_promise;  // Is this safe?
};


void performAsyncOp(const X& x) {
     std::future<Data> fut = x.prepare();
     dispatch(x);
     std::future_status result = fut.wait_for(std::chrono::milliseconds(150));
     if (result == std::future_status::timeout) {
         x.cancel();
     }

     handleResult(fut.get());
}
Run Code Online (Sandbox Code Playgroud)

c++ asynchronous promise c++11

5
推荐指数
1
解决办法
914
查看次数

将可变参数模板转发给几个类成员

以下是安全的吗?第一类成员初始化后不会std::string被发现move吗?打印出来好,但我不确定.

template <typename T>
class Test
{
public:

    template <typename... Args>
    Test(Args&&... args)
    :  m_one(new T(std::forward<Args>(args)...)),
       m_two(new T(std::forward<Args>(args)...))    // <- Here
    {
    }

private:
    std::unique_ptr<T> m_one;
    std::unique_ptr<T> m_two;
};


class C
{ 
public:

    C(int a, int b, const std::string& c)
    :  m_a(a),
       m_b(b),
       m_c(c)
    {
        std::cout << "ctor a=" << m_a << ", b=" << m_b << ", c=" << m_c << "\n";
    }

    int m_a;
    int m_b;
    std::string m_c;
};


int main()
{
     Test<C> t(1, …
Run Code Online (Sandbox Code Playgroud)

c++ templates perfect-forwarding c++11

4
推荐指数
1
解决办法
377
查看次数

静态lambda是任何使用/不明智?

我正在尝试跟踪一个非常难以重现的错误.我有一个项目池,并使用以下内容在客户端完成后自动检查池项目:

typedef std::shared_ptr<T> Handle;

Handle MyPool::checkOut()
{
    static const auto CheckInDeleter = [this](T* item)
    {
        this->checkIn(item);
    };

    return Handle(item, CheckInDeleter);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是这不安全吗?将this被分配到签出项目的第一个池?

lambda c++11

3
推荐指数
1
解决办法
146
查看次数

当超出范围时,停止调用d'tors的std :: vector

我正在将一些Java移植到C++,并且天真地投入使用std::vector.

这是我的问题.我有一个对象存储库,稍后我会要求这个存储库中的对象列表满足某些条件.目前我正在将它们读成临时的std::vector.事实证明,当这个临时超出范围时,delete它的内容当然会导致存储库中的悬空指针.

这是我目前的"解决方法",我觉得特别恶心.

#define NULLIFY(aParam) \
{ \
    for (size_t i = 0; i < aParam.size(); i++) { \
        aParam[i] = NULL; \
    } \
}

typedef std::vector<Object*> TObjectVector;

int main(int argc, char* argv[])
{
    PopulateRepository(); // repository uses std::set

    TObjectVector subset;
    Repository.GetConditionSatisfyingObjects(subset);
    DoSomething(subset);

    NULLIFY(subset); // Stop destruction of the objects.
}
Run Code Online (Sandbox Code Playgroud)

我对其他想法持开放态度.我最初使用原始指针和动态分配,但我想看看是否有使用STL的加速,因为我有更少的参数传递.该程序是多线程和CPU密集型的.

c++ stl

0
推荐指数
1
解决办法
92
查看次数