See More

/* * allocation.cpp * * Created on: 12 oct. 2013 * Author: Loic Oudot */ #include #include #include "java4cpp/java_classes.h" #include "java4cpp_thread.h" #include "multithread.h" #define NB_THREAD 10 #define NB_ITER 1000000 #define LENGTH 5 using namespace java4cpp::demos; void allMultithread() { std::cout << "================================" << std::endl; std::cout << "Multithread" << std::endl; std::cout << "================================" << std::endl; threadsafe(); benchmark(); } callback_t callbackThreadsafe(void *in) { Threads* thread = (Threads*)in; for(int i = 0; i < NB_ITER; ++i) { thread->threadsafe(); } return 0; } void threadsafe() { Threads thread; thread_t threads[NB_THREAD]; for (int i = 0; i < NB_THREAD; ++i) { thread_create(threads[i], callbackThreadsafe, &thread); } for (int i = 0; i < NB_THREAD; ++i) { thread_wait_close(threads[i]); thread_delete(threads[i]); } std::cout << "threadsafe: " << (thread.getIter() == NB_THREAD * NB_ITER) << std::endl; } callback_t callbackBenchmark(void *in) { Benchmark benchmark; time_t start = time(NULL); long nbCall = 0; double elapsed; do { for (int i = 0; i < 10000; ++i) { benchmark.noArgMethod(); } ++nbCall; elapsed = difftime(time(NULL),start); }while ( elapsed < LENGTH); *((long*)in) = (long)((nbCall * 10000) / elapsed); return 0; } void benchmark() { for (int nbThread = 1; nbThread < 5; ++nbThread) { std::cout << "benchmark " << nbThread << " threads:" << std::endl; thread_t* threads = new thread_t[nbThread]; long* results = new long[nbThread]; for (int i = 0; i < nbThread; ++i) { thread_create(threads[i], callbackBenchmark, results + i); } for (int i = 0; i < nbThread; ++i) { thread_wait_close(threads[i]); thread_delete(threads[i]); } long total = 0; for (int i = 0; i < nbThread; ++i) { std::cout << "thread " << i << ": " << results[i] << " calls/sec" << std::endl; total += results[i]; } std::cout << "total: " << total << " calls/sec" << std::endl; delete[] results; delete[] threads; } }