Namespaces
Variants
Views
Actions

Talk:cpp/thread/thread/thread

From cppreference.com

Is this even possible to call std::thread with "a pointer to a member data object of a class"? What does it do?

I think the invoke template should not be used for std::thread because passing a data member makes no sense for a thread.

It is possible:
#include <iostream>
#include <thread>
 
struct S {
    int data;
};
 
int main() {
    S s;
    std::thread t(&S::data, s);
    std::cout << "Launched the thread, tid = " << t.native_handle() << '\n';
    t.join();
}


Works in clang++/libc++ too. We could make a Note mentioning that it's pointless to do so - it's not the only thing C++ allows that's pointless. --Cubbi 18:46, 28 August 2013 (PDT)
You can use side effects of operations, strange way, but works:
#include <thread>
#include <iostream>
#include <mutex>
 
std::mutex cout_lock;
 
struct Value {
  ~Value() {
    std::lock_guard<std::mutex> lock(cout_lock);
    std::cout << "Value dtor (id: " << std::this_thread::get_id() << ")\n";
  }
};
 
struct A {
  Value value;
};
 
class B {
 public:
  A& operator*() {
    std::lock_guard<std::mutex> lock(cout_lock);
    std::cout << "B::operator* (id: " << std::this_thread::get_id() << ")\n";
    return a_;
  }
 public:
  static A a_;
};
 
int main() {
  std::cout << "main thread = " << std::this_thread::get_id() << std::endl;
 
  A a;
  B b;
  std::thread thread_1(&A::value, a);
      // (return t1.*f) dtor invoked in other thread
  std::thread thread_2(&A::value, b);
      // ((*t1).*f) B::operator* invoked in other thread
 
  thread_1.join();
  thread_2.join();
}


Ruslo 01:50, 29 August 2013 (PDT)