4 * Created on: Jun 10, 2014
11 #include <boost/thread/thread.hpp>
12 #include <boost/thread/mutex.hpp>
14 namespace tizen_browser
19 template<typename T, typename R>
22 void setData(std::vector<T> data) {
25 void setWorker(R (*worker)(T)) {
26 this->worker = worker;
30 if (data.size() == 0) {
32 throw std::exception();
42 boost::lock_guard<boost::mutex> lock(results_lock);
46 std::vector<R> getResults() {
50 R executeWorker(T t) {
56 std::vector<R> results;
59 boost::mutex results_lock;
62 template<typename T, typename R>
65 WorkQueue(int threads) {
66 this->threadCount = threads;
69 void setWorker(R (*worker)(T)) {
70 this->workData.setWorker(worker);
73 void setData(std::vector<T> data) {
74 this->workData.setData(data);
77 std::vector<R> getResults() {
78 return this->workData.getResults();
82 boost::thread taskThreads[threadCount];
83 for (int i = 0; i < threadCount; i++) {
84 taskThreads[i] = boost::thread(WorkQueue::threadWorker, &workData);
86 for (int i = 0; i < threadCount; i++) {
87 taskThreads[i].join();
91 static void threadWorker(WorkData<T, R>* workData) {
93 while (done != true) {
95 T t = workData->getNext();
96 R r = workData->executeWorker(t);
97 workData->addResult(r);
98 } catch (std::exception& e) {
105 WorkData<T, R> workData;
109 template<typename T, typename R>
110 std::vector<R> parallel_for_each(std::vector<T> inputs, R (*func)(T)) {
111 tizen_browser::tools::WorkQueue<T, R> workQueue(4);
112 workQueue.setData(inputs);
113 workQueue.setWorker(func);
115 return workQueue.getResults();
120 #endif /* WORKQUEUE_H_ */