af4a86781e
[SVN r51635]
59 lines
1.6 KiB
C++
59 lines
1.6 KiB
C++
/* multi-threaded signal invocation benchmark */
|
|
|
|
// Copyright Frank Mori Hess 2007-2008.
|
|
// Distributed under the Boost Software License, Version
|
|
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
#include <cstdlib>
|
|
#include <iostream>
|
|
#include <boost/bind.hpp>
|
|
#include <boost/signals2.hpp>
|
|
#include <boost/thread/thread.hpp>
|
|
|
|
typedef boost::signals2::signal<void ()> signal_type;
|
|
|
|
void myslot()
|
|
{
|
|
/* std::cout << __FUNCTION__ << std::endl;
|
|
sleep(1);*/
|
|
}
|
|
|
|
void thread_initial(signal_type *signal, unsigned num_invocations)
|
|
{
|
|
unsigned i;
|
|
for(i = 0; i < num_invocations; ++i)
|
|
{
|
|
(*signal)();
|
|
}
|
|
}
|
|
|
|
int main(int argc, const char **argv)
|
|
{
|
|
if(argc < 3)
|
|
{
|
|
std::cerr << "usage: " << argv[0] << " <num threads> <num connections>" << std::endl;
|
|
return -1;
|
|
}
|
|
static const unsigned num_threads = std::strtol(argv[1], 0, 0);
|
|
static const unsigned num_connections = std::strtol(argv[2], 0, 0);
|
|
boost::thread_group threads;
|
|
signal_type sig;
|
|
|
|
std::cout << "Connecting " << num_connections << " connections to signal.\n";
|
|
unsigned i;
|
|
for(i = 0; i < num_connections; ++i)
|
|
{
|
|
sig.connect(&myslot);
|
|
}
|
|
const unsigned num_slot_invocations = 1000000;
|
|
const unsigned signal_invocations_per_thread = num_slot_invocations / (num_threads * num_connections);
|
|
std::cout << "Launching " << num_threads << " thread(s) to invoke signal " << signal_invocations_per_thread << " times per thread.\n";
|
|
for(i = 0; i < num_threads; ++i)
|
|
{
|
|
threads.create_thread(boost::bind(&thread_initial, &sig, signal_invocations_per_thread));
|
|
}
|
|
threads.join_all();
|
|
return 0;
|
|
}
|