小编Ant*_*ier的帖子

Cuda Mutex,为什么会死锁?

我正在尝试实现基于原子的互斥锁。

我成功了,但我有一个关于扭曲/死锁的问题。

这段代码运行良好。

bool blocked = true;

while(blocked) {
    if(0 == atomicCAS(&mLock, 0, 1)) {
        index = mSize++;

        doCriticJob();

        atomicExch(&mLock, 0);
        blocked = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这个不...

while(true) {
    if(0 == atomicCAS(&mLock, 0, 1)) {
        index = mSize++;

        doCriticJob();

        atomicExch(&mLock, 0);
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这是退出循环的位置。在第一个中,退出发生在条件所在的位置,在第二个中它发生在 if 的末尾,所以线程等待其他经纱完成循环,但其他线程也等待第一个线程......但我想我错了,所以如果你能解释我:)。

谢谢 !

cuda

2
推荐指数
1
解决办法
2111
查看次数

间接转发参考

众所周知,"直接"转发引用的工作方式很简单:

template<typename T>
void f(T &&t); // Here we are.
Run Code Online (Sandbox Code Playgroud)

现在,如何以间接方式使用转发引用:

template<typename T>
void f(some_class_template<T> &&f); // Here it is an rvalue reference and not universal one
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,有没有办法获得转发参考?

c++ c++14

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

结构化绑定:循环遍历元组的双端队列

我刚刚安装了最后一个版本的Visual Studio,我有这个元组的deque:

using InstancesOfOneObject = std::tuple<DrawCmd, std::deque<bool>, std::deque<glm::mat4>>;
std::deque<InstancesOfOneObject> mInstancesByObject;
Run Code Online (Sandbox Code Playgroud)

之后,我想用一个远程循环来遍历这个双端队列:

for (const auto &[cmd, validites, matrices] : mInstancesByObject)
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,但是:

for (const auto &instance : mInstancesByObject) {
    const auto &[cmd, validities, matrices] = instance;
Run Code Online (Sandbox Code Playgroud)

效果很好.

这是正常的吗?有没有办法使用接近第一个想法的东西?

c++ c++17

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

虚拟析构函数与RAII一起使用

我的问题如下:以下代码是否正确:

class A {}; // no virtual destructor

class B : public A{
    std::unique_ptr<int> ptr{new int(5)};
};

// in main
std::unique_ptr<A> = new B;
Run Code Online (Sandbox Code Playgroud)

它可能会有一些编译错误,但只是理解这个概念.指针是否会被正确删除(我的意思是ptr会被删除吗?)或者我们是否需要虚拟析构函数来确保它

c++

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

标签 统计

c++ ×3

c++14 ×1

c++17 ×1

cuda ×1