Differences
This shows you the differences between two versions of the page.
| — |
c_11:examples:thread_2.cc [2017/02/25 18:02] (current) mike created |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== thread_2.cc ====== | ||
| + | |||
| + | <file c++ thread_2.cc> | ||
| + | #include <iostream> | ||
| + | #include <thread> | ||
| + | #include <mutex> | ||
| + | |||
| + | using namespace::std; | ||
| + | |||
| + | // gcc -std=c++11 thread_1.cc -lstdc++ -o thread_1 | ||
| + | |||
| + | std::mutex mu; | ||
| + | |||
| + | void shared_print(string msg,int id) { | ||
| + | std::lock_guard<std::mutex> guard(mu); // RAII - when guard goes out of scope | ||
| + | //mu.lock(); // if cout throws an exception then the program will be locked forever. | ||
| + | cout << msg << id << endl; // still could mess up output if other process writes to cout. | ||
| + | //mu.unlock(); | ||
| + | } | ||
| + | |||
| + | void fun1() { | ||
| + | |||
| + | cout << "Im in function 1"<<endl; | ||
| + | } | ||
| + | class Fctor { | ||
| + | public: | ||
| + | void operator()(string& msg) { | ||
| + | for(int i=0;i>-10;i--) | ||
| + | // cout << msg << i <<endl; | ||
| + | shared_print(string(msg),i); | ||
| + | } | ||
| + | }; | ||
| + | |||
| + | int main(void) | ||
| + | { | ||
| + | string s = "Message from main."; | ||
| + | //std::thread t1((Fctor()),s); // Parameters passed to a thread are always by value. | ||
| + | std::thread t1((Fctor()),std::ref(s)); | ||
| + | // or you can use std::move(s) | ||
| + | // transfer ownership of thread | ||
| + | std::thread t2 = std::move(t1); | ||
| + | |||
| + | // print out the ID | ||
| + | cout << std::this_thread::get_id() << endl; | ||
| + | cout << t2.get_id() <<endl; | ||
| + | |||
| + | // Prevent Oversubscription - minimize context switching | ||
| + | // std::thread::hardware_concurrency(); | ||
| + | |||
| + | try { | ||
| + | for(int i=0;i<10;i++) | ||
| + | // cout << "in main:"<<i<<endl; | ||
| + | shared_print(string("In Main:"),i); | ||
| + | } catch (...) { | ||
| + | t2.join(); | ||
| + | throw; | ||
| + | } | ||
| + | |||
| + | t2.join(); | ||
| + | } | ||
| + | </file> | ||
| + | |||
| + | <file make Makefile> | ||
| + | |||
| + | TARGETS=thread_1 thread_2 | ||
| + | |||
| + | all: $(TARGETS) | ||
| + | |||
| + | % : %.cc | ||
| + | gcc -std=c++11 $^ -lstdc++ -o $@ | ||
| + | |||
| + | clean: | ||
| + | rm $(TARGETS) | ||
| + | </file> | ||