我知道这类问题已被提出,但我无法弄清楚我得到错误的原因..
我正在尝试使用多个线程测试下面给出的锁实现:
Columns("B:D").EntireColumn.Hidden = False
Columns("I:N").EntireColumn.Hidden = False
Dim r1, r2 As Range
Set r1 = Range("B:D")
Set r2 = Range("I:N")
Range("E4:E").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
ActiveSheet.PageSetup.PaperSize = xlPaperA4
ActiveSheet.PageSetup.Orientation = xlPortrait
ActiveSheet.Range(r1, r2).PrintPreview
我正在使用以下代码为此创建线程:
class TTAS
{
atomic<bool> state;
public:
TTAS(){
state = ATOMIC_FLAG_INIT;
}
void lock() {
while(true) {
while(state) {};
// using exchange() which is equivalent to getAndSet but with lookup
if (!state.exchange(true)) {
return;
}
}
}
void unlock() {
state.exchange(false);
}
};
当我编译此代码时,我得到以下错误。我不知道我在这里做错了什么..
void test2(TTAS t) {
}
TTAS t();
for (int i = 0; i < 10; i++) {
// Create a thread and push it into the thread list and call the distributedWrite function
threadList.push_back(std::thread(test2, std::ref(t)));
}
有人可以解释一下这个错误。提前致谢
答案 0 :(得分:4)
您似乎遇到了most vexing parse
TTAS t();
t
是一个不带参数的函数,并返回TTAS
。
优先于传统的 1 语法:
。TTAS t{}; // no ambiguity here
您的代码test2
还有一个问题是按值获取其参数,但TTAS
包含std::atomic<bool>
,它既不可复制也不可移动。
1 虽然这有点用词不当,因为它不是那么统一
答案 1 :(得分:3)
TTAS t();
是一个函数声明。如果你想要一个默认构造的变量,请将它声明为TTAS t;
。