Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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>​