【发布时间】:2011-10-14 14:34:49
【问题描述】:
我制作了以下示例程序来使用 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:错误 LNK2001:未解析的外部符号 “私有:静态类 boost::mutex ThreadWorker::mutex_” (?mutex_@ThreadWorker@@0Vmutex@boost@@A) 1>c:\something\ThreadTest\Debug\ThreadTest.exe:致命错误 LNK1120: 1 个未解决的外部问题
还在玩。
【问题讨论】:
-
该代码无法编译。
mutex_是真实代码中类中的静态成员吗? -
static int i本质上是一个共享全局变量,它没有受到保护(它被不同的互斥锁保护......) -
静态类函数不能访问类的非静态成员。如果第一个是静态函数而第二个是非静态成员,
FirstCount无法访问mutex_。 -
我是否这样做还有待商榷。但是,它确实封装了互斥体。
-
@curiousguy 也许他的原因是他喜欢 ThreadWorker 这个名字,所以他想创建一个对象并命名它。也许他只是在学习线程,认为它们很酷,并且正在与它们一起玩以了解它们是如何工作的。有点像你小时候在沙盒里玩耍时兴奋不已,嘴里塞了一把沙子。当你现在回头看时,你会觉得恶心和愚蠢,但在那一刻,它是一种新的、令人兴奋的东西,而且太棒了,周围没有人教你解释自己。他的问题很明确。
标签: c++ multithreading locking thread-safety boost-thread