小编use*_*761的帖子

多线程单例:实例方法是否需要互斥锁?

我将应用程序的配置存储在单例类中,如下所示(简化):

class Conf
{
    Conf();
    Conf(const Conf&);
    Conf& operator=(const Conf&);
    ~Conf();

public:

    static Conf& instance() 
    {
        static Conf singleton;
        return singleton;
    };

    static void setProperty(const std::string& name,
                            const std::string& value);
    static std::string getProperty(const std::string& name);

private:

    QMutex _mutex;
    std::map<std::string, std::string> _properties;
};
Run Code Online (Sandbox Code Playgroud)

因为可以从许多线程访问配置类,所以我使用mutex进行同步:

void Conf::setProperty(const std::string& name,
                 const std::string& value)
{
    QMutexLocker(&Conf::instance()._mutex);
    Conf::instance()._properties[name]=value;
}

std::string Conf::getProperty(const std::string& name)
{
    QMutexLocker(&Conf::instance()._mutex);
    return Conf::instance()._properties[name];
}
Run Code Online (Sandbox Code Playgroud)

Conf::instance()方法是否还需要锁定?

我发现了类似的问题:getter函数是否需要互斥锁?,但在我的情况下,没有setter方法(假设在线程开始之前创建单例的实例).

c++ singleton multithreading mutex

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

如何将持续时间添加到 time_point?

我试过这样的事情:

using clock = std::chrono::system_clock;
clock::time_point nowp = clock::now();
clock::time_point end = nowp + std::chrono::seconds(10);
time_t nowt =  clock::to_time_t ( nowp );
time_t endt =  clock::to_time_t ( end);
std::cerr  << " " << ctime(&nowt) << " " << ctime(&endt) << std::endl;
Run Code Online (Sandbox Code Playgroud)

但它打印:

Sat Dec 16 15:06:43 2017
Sat Dec 16 15:06:43 2017
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?怎么加十秒到现在?

c++ c++-chrono

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

在不在主线程中的循环中使用QPainter和QImage

通过这个简单的循环:

for(int i=0;i<levels;i++)
{
    QImage stub(QSize(w,h),QImage::Format_RGB888);

    QPainter painter(&stub);
    painter.setFont(QFont("Monospace",8));
    painter.setPen(Qt::magenta);
    painter.drawText(stub.rect(),
                     Qt::AlignVCenter|Qt::AlignCenter,
                     QString("LAYER-%1").arg(i));

    stub.save(QString("layer%1.jpg").arg(i),"JPG");
}
Run Code Online (Sandbox Code Playgroud)

我得到一个有趣的结果:

层0 layer1的 三层

请注意图像上打印的图层编号.这看起来像一些缓冲问题.我还要提一下,这个循环不在主线程中运行.如何同步QPaitner和QImage保存?

qt qpainter qimage

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

SFINAE和标签分发之间的区别

在此视频中,https: //youtu.be/Vkck4EU2lOU?t = 582展示了“标签分发”和SFINAE作为替代方案,使您可以选择所需的模板功能。

这是对的吗?不是使用SFINAE进行“标签分配”吗?如果正确,那么SFINAE和代码分发之间到底有什么区别?

c++ templates sfinae tag-dispatching

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