我正在尝试实现基于原子的互斥锁。
我成功了,但我有一个关于扭曲/死锁的问题。
这段代码运行良好。
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 的末尾,所以线程等待其他经纱完成循环,但其他线程也等待第一个线程......但我想我错了,所以如果你能解释我:)。
谢谢 !
众所周知,"直接"转发引用的工作方式很简单:
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)
在第二种情况下,有没有办法获得转发参考?
我刚刚安装了最后一个版本的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)
效果很好.
这是正常的吗?有没有办法使用接近第一个想法的东西?
我的问题如下:以下代码是否正确:
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会被删除吗?)或者我们是否需要虚拟析构函数来确保它