blob: 73879fae5f17fd055e043d244aea13efd7c4f2b3 [file] [log] [blame]
// Copyright (C) 2013 Vicente Botet
//
// 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)
// B
#include <malloc.h>
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <iostream>
static void
display_mallinfo()
{
struct mallinfo mi;
mi = mallinfo();
printf("Total non-mmapped bytes (arena): %d\n", mi.arena);
printf("# of free chunks (ordblks): %d\n", mi.ordblks);
printf("# of free fastbin blocks (smblks): %d\n", mi.smblks);
printf("# of mapped regions (hblks): %d\n", mi.hblks);
printf("Bytes in mapped regions (hblkhd): %d\n", mi.hblkhd);
printf("Max. total allocated space (usmblks): %d\n", mi.usmblks);
printf("Free bytes held in fastbins (fsmblks): %d\n", mi.fsmblks);
printf("Total allocated space (uordblks): %d\n", mi.uordblks);
printf("Total free space (fordblks): %d\n", mi.fordblks);
printf("Topmost releasable block (keepcost): %d\n", mi.keepcost);
}
boost::mutex io_mutex;
void count() {
for (int i = 0; i < 10; ++i) {
boost::mutex::scoped_lock lock(io_mutex);
//boost::this_thread::sleep( boost::posix_time::milliseconds( 100 ) );
}
}
void* count2(void*) {
for (int i = 0; i < 10; ++i) {
boost::mutex::scoped_lock lock(io_mutex);
boost::this_thread::sleep( boost::posix_time::milliseconds( 100 ) );
}
return 0;
}
int main() {
printf("\n============== sizeof(boost::thread) ============== %d\n", sizeof(boost::thread));
printf("\n============== sizeof(boost::detail::thread_data_base) ============== %d\n", sizeof(boost::detail::thread_data_base));
printf("\n============== sizeof(boost::detail::thread_data<>) ============== %d\n", sizeof(boost::detail::thread_data<void(*)()>));
printf("\n============== Before thread creation ==============\n");
display_mallinfo();
{
boost::thread thrd1(&count);
printf("\n============== After thread creation ==============\n");
display_mallinfo();
boost::thread thrd2(&count);
printf("\n============== After thread creation ==============\n");
display_mallinfo();
boost::thread thrd3(&count);
printf("\n============== After thread creation ==============\n");
display_mallinfo();
thrd1.join();
printf("\n============== After thread join ==============\n");
display_mallinfo();
thrd2.join();
printf("\n============== After thread join ==============\n");
display_mallinfo();
thrd3.join();
printf("\n============== After thread join ==============\n");
display_mallinfo();
}
printf("\n============== After thread destruction ==============\n");
display_mallinfo();
{
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_t thrd1;
pthread_create(&thrd1, &attr, &count2, 0);
printf("\n============== After thread creation ==============\n");
display_mallinfo();
pthread_t thrd2;
pthread_create(&thrd2, &attr, &count2, 0);
printf("\n============== After thread creation ==============\n");
display_mallinfo();
pthread_t thrd3;
pthread_create(&thrd3, &attr, &count2, 0);
printf("\n============== After thread creation ==============\n");
display_mallinfo();
pthread_attr_destroy(&attr);
printf("\n============== After thread attr destroy ==============\n");
display_mallinfo();
void* res;
pthread_join(thrd3, &res);
printf("\n============== After thread join ==============\n");
display_mallinfo();
pthread_join(thrd2, &res);
printf("\n============== After thread join ==============\n");
display_mallinfo();
pthread_join(thrd1, &res);
printf("\n============== After thread join ==============\n");
display_mallinfo();
//pthread_destroy(&thrd1);
//pthread_destroy(&thrd2);
//pthread_destroy(&thrd3);
}
printf("\n============== After thread destruction ==============\n");
display_mallinfo();
return 1;
}