小编Sad*_*Kao的帖子

为什么 std::counting_semaphore::acquire() 在这种情况下会遇到死锁?

我正在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)

c++ multithreading semaphore c++20

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

在 C++ 中使用 std::make_shared 的“类型擦除”代码中的类和结构有什么区别?

我试图通过使用来理解“类型擦除”的行为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)

c++

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

标签 统计

c++ ×2

c++20 ×1

multithreading ×1

semaphore ×1