gpt4 book ai didi

c++ - 为每种参数类型重新定义相同模式的函数

转载 作者:行者123 更新时间:2023-11-28 06:34:17 25 4
gpt4 key购买 nike

我必须同步一个线程不安全的输出函数,这样当多个线程试图同时与标准输出交互时它才不会崩溃。我做过一些 C,但我对 C++ 编程还很陌生。在 C 中通常没有那么多泛型函数,但在 C++ 中我可以看到一个方法或重载运算符甚至有十个或更多版本,具有不同的参数类型。

在我下面的程序中,我通过调用 QTextStream::operator<< 的另一个函数 print() 锁定了 QTextStream 的 operator<<。我想更改我的代码,每当我调用 QTextStream::operator<< 时,它都会自动成为互斥锁定版本。如何做到这一点?

还有一个小问题,当我将 QMutex 全局变量作为 print() 的局部变量放入时,为什么我的代码不起作用?

QTextStream qout(stdout);
QMutex mutex;

template<typename T>
void print(T t)
{
QMutexLocker locker(&mutex);
qout << t << flush;
}

class my_thread : public QThread
{
public:
int n;

my_thread()
{
n = 0;
}

void run()
{
while(n < 10)
{
print(n++);
msleep(500);
}
}
};

int main()
{
enum { N_THREADS = 10 };
std::array<my_thread, N_THREADS> thread_array;
for (auto& thread : thread_array)
{
thread.start();
}
for (auto& thread : thread_array)
{
thread.wait();
}
return 0;
}

最佳答案

这个(未测试)怎么样?

class LockedTextStream {
private:
QMutex mutex;
QTextStream textStream;

public:
template <class... Args>
LockedTextStream(Args&&... args) : textStream(std::forward<Args>(args)...) {}

template <class T>
LockedTextStream& operator<<(const T& t) {
QMutexLocker locker(&mutex);
textStream << t;
return *this;
}
};

LockedTextStream sharedStream(stdout);

...
sharedStream << n++;
....

这个包装器应该接受任何构造函数参数并将它们转发给 QTextStream,并且应该锁定对 operator<<() 的任何调用。

QMutex 不能是函数内部的局部变量的原因是互斥量是在该函数的上下文中分配的。互斥体的全部意义在于您在每个线程中操作相同互斥体。

关于c++ - 为每种参数类型重新定义相同模式的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27002013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com