gpt4 book ai didi

c++ - boost::scoped_lock 不适用于局部静态变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:33 27 4
gpt4 key购买 nike

我制作了以下示例程序来使用 boost 线程:

#pragma once
#include "boost\thread\mutex.hpp"
#include <iostream>

class ThreadWorker
{
public:
ThreadWorker() {}
virtual ~ThreadWorker() {}

static void FirstCount(int threadId)
{
boost::mutex::scoped_lock(mutex_);
static int i = 0;

for(i = 1; i <= 30; i++)
{
std::cout << i << ": Hi from thread: " << threadId << std::endl;
}

}

private:
boost::mutex mutex_;
};

主类:

// ThreadTest.cpp
#include "stdafx.h"
#include "boost\thread\thread.hpp"
#include "ThreadWorker.h"

int _tmain(int argc, _TCHAR* argv[])
{
boost::thread thread1(&ThreadWorker::FirstCount, 1);
boost::thread thread2(&ThreadWorker::FirstCount, 2);
boost::thread thread3(&ThreadWorker::FirstCount, 3);

thread1.join();
thread2.join();
thread3.join();

std::string input;
std::cout << "Press <enter> to finish...\n";
std::getline( std::cin, input );
return 0;
}

当我运行它时,我得到以下输出:

1: Hi from thread:  1
1: Hi from thread: 3
2: Hi from thread: 3
...

看起来线程 1 先到达那里,然后是线程 3。scoped_lock 不是应该防止其他线程进入那段代码吗?运行 FirstCount() 的第一个线程不应该完成吗?

更新

我认为我的代码有一个问题是这一行:

boost::mutex::scoped_lock(mutex_);

我觉得应该是这样的:

boost::mutex::scoped_lock xyz(mutex_);

一旦我这样做,它确实会提示 mutex_ 不是静态的。为什么它首先起作用我不确定。将 mutex_ 更改为 static 确实会给我一个链接错误:

1>ThreadWorker.obj : error LNK2001: unresolved external symbol "private: static class boost::mutex ThreadWorker::mutex_" (?mutex_@ThreadWorker@@0Vmutex@boost@@A) 1>c:\something\ThreadTest\Debug\ThreadTest.exe : fatal error LNK1120: 1 unresolved externals

还在玩。

最佳答案

你有两个错误:

首先,如前所述,mutex_ 也应该是静态的:

private:
static boost::mutex mutex_;

当然还有在某处声明它(最好在 .cpp 文件中!):

boost::mutex ThreadWorker::mutex_{};

现在,为什么编译器不提示?好吧,因为您实际上并未在此处构造带参数 mutex_ 的作用域锁:

boost::mutex::scoped_lock(mutex_);

实际上这不会调用您想要的构造函数,而是创建一个类型为 scoped_lock 并由默认构造函数构造的(本地)对象 mutex_。因此,没有编译器问题。您应该将其更改为如下内容:

boost::mutex::scoped_lock l{mutex_};

现在编译器应该开始提示 mutex_

关于c++ - boost::scoped_lock 不适用于局部静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7769223/

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