我正在std::counting_semaphore使用 Windows 10 和 MinGW x64 在 C++20 上进行测试。
正如我从https://en.cppreference.com/w/cpp/thread/counting_semaphore了解到的,std::counting_semaphore是一个原子计数器。我们可以使用release()增加计数器,使用acquire()减少计数器。如果计数器等于 0,则线程等待。
我构建了以下简化示例来展示我的问题。如果我总是在线程release()之前,则内部计数器值(v)应始终保持在 v 和 v+1 之间,并且此代码不应遭受任何阻塞。acquire()std::counting_semaphore
当我运行这个示例代码时,它经常遇到死锁,但有时它可以正确完成。
我尝试使用std::cout消息来了解死锁情况,但是当我使用std::cout. 另一方面,当我使用 时,僵局消失了std::unique_lock。
示例如下:
#include <iostream>
#include <thread>
#include <atomic>
#include <vector>
#include <mutex>
#include <semaphore>
using namespace std::literals;
std::mutex mtx;
const int numOfThr {2};
const int numOfForLoop {1000};
const int max_smph {numOfThr* numOfForLoop *2};
std::counting_semaphore<max_smph> smph {numOfThr+1};
void thrf_TestSmph ( const int …Run Code Online (Sandbox Code Playgroud) 我试图通过使用来理解“类型擦除”的行为std::make_shared。基本思想是使用一个类Object来包装一些不同的类,例如类Foo和类Bar。
我编写了以下代码,它确实有效。
// TypeErasure.cpp
#include <iostream>
#include <memory>
#include <string>
#include <vector>
class Base
{
public:
virtual ~Base() {}
virtual std::string getName() const = 0;
};
template< typename T >
struct Derived : Base
{
public:
explicit Derived(const T&& t) : objD(t) {}
std::string getName() const override
{
return objD.getName();
}
private:
T objD;
};
class Object
{
public:
template <typename T>
explicit Object(T&& t)
: objPtr(std::make_shared<Derived<T>>(std::forward<T>(t))) {}
std::string getName() const
{
return objPtr->getName();
}
std::shared_ptr<const Base> objPtr; …Run Code Online (Sandbox Code Playgroud)