有一个不时的线程(在无限循环中有一个函数的线程,在函数完成时生成数据)生成一些数据(例如random int)。 并且需要不时获取生成数据的3个其他线程(在无限循环中具有一个函数的线程,在函数启动时需要数据)。所有3个线程都希望在循环中修改该int并返回不同的东西。
如何让其他线程可以访问第一个线程生成的数据? (对不起 - 我是C ++ nob。我可以使用boost库。求求你提供代码和答案。)
答案 0 :(得分:3)
根据细节,有很多方法可以做到这一点。由于你没有提供很多细节,所以让我们选择一些简单且防弹的东西。
如何使线程安全获取和放置方法?
这样的事情:
class mySafeData
{
public:
void Set( int i )
{
myMutex.lock();
myData = i;
myMutex.unlock();
}
void Get( int& i)
{
myMutex.lock();
i = myData;
myMutex.unlock();
}
private:
int myData;
boost::mutex myMutex;
};
此方法效率不高。恕我直言,使用最简单,最容易理解的技术让代码工作非常重要。一旦它正常工作,如果性能有问题,可以优化代码。
答案 1 :(得分:3)
这是一个原始示例,它演示了如何创建一个产生随机数并将它们放入队列的线程,以及三个消费者线程,它从队列中提取随机数并在随机数仅为奇数时打印它们。这个例子可以大大改进,并且为了解释基本设施(thread_group,mutex和随机数生成都使用boost),没有遵循许多最佳实践:
#include <iostream>
#include <queue>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/random.hpp>
#include <boost/bind.hpp>
std::queue<int> random_stream;
boost::mutex random_stream_mutex, output_mutex;
// create a random number generator similar to good ol' std::rand!
boost::mt19937 rand_generator;
boost::uniform_int<> distribution;
auto random_producer = boost::bind(distribution, rand_generator);
bool isodd(int number)
{ return number % 2 == 1; }
void random_generator()
{
for(;;)
{
// generate a random number, then lock the queue and push
// the number into it.
int random_number = random_producer();
random_stream_mutex.lock();
random_stream.push(random_number);
random_stream_mutex.unlock();
}
}
void output_odd_randoms()
{
for(;;)
{
// lock the queue then extract the number.
random_stream_mutex.lock();
int random_number = random_stream.front();
random_stream.pop();
random_stream_mutex.unlock();
// print the extracted number if it is odd!
if(isodd(random_number))
{
output_mutex.lock();
std::cout << boost::this_thread::get_id() << ": "
<< random_number << std::endl;
output_mutex.unlock();
}
}
}
int main()
{
// create the producer and the consumers!
boost::thread_group threads;
threads.create_thread(random_generator);
threads.create_thread(output_odd_randoms);
threads.create_thread(output_odd_randoms);
threads.create_thread(output_odd_randoms);
// wait for ever! :)
threads.join_all();
}
如您所见,代码使用全局变量,但封装数据是一个更好的主意。此外,使用RAII锁定机制更优雅,但修改代码以添加它们是微不足道的。
希望有所帮助,