sintaks - C++11 thread memanggil fungsi ahli objek
迷茫
迷茫 2017-05-16 13:22:21
0
2
1060

Jika anda menggugurkan fungsi ahli kelas, ia mungkin seperti ini.

clientThread = std::thread(&Client::sendMessage,“message”);

Tetapi bagaimana jika anda mahu objek khusus kelas ini melaksanakan operasi ini?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

membalas semua(2)
某草草

std::thread memanggil fungsi ahli kelas dan perlu menghantar objek kelas sebagai parameter:

#include <thread>
#include <iostream>

class bar {
public:
  void foo() {
    std::cout << "hello from member function" << std::endl;
  }
};

int main()
{
  std::thread t(&bar::foo, bar());
  t.join();
}

Jika anda sedang memproses benang dalam fungsi ahli kelas, hanya lulus dalam ini, seperti:

std::thread spawn() {
    return std::thread(&blub::test, this);
  }

Rujukan: stackoverflow

刘奇

参考C tambah tambah

Parameter
fn
Penuding kepada fungsi, penuding kepada ahli, atau apa-apa jenis objek fungsi yang boleh dibina bergerak (iaitu, objek yang kelasnya
mentakrif operator(), termasuk penutupan dan objek fungsi).
Nilai pulangan (jika ada) diabaikan.
args...
Hujah yang dihantar kepada panggilan ke fn (jika ada). Jenis mereka hendaklah boleh digerakkan. Jika fn ialah penunjuk ahli, hujah pertama hendaklah objek yang ahli itu ditakrifkan atau rujukan, atau penunjuk kepadanya).
x
objek benang yang keadaannya dialihkan ke objek yang dibina.

// constructing threads
#include <iostream>       // std::cout
#include <atomic>         // std::atomic
#include <thread>         // std::thread
#include <vector>         // std::vector

std::atomic<int> global_counter (0);

void increase_global (int n) { for (int i=0; i<n; ++i) ++global_counter; }

void increase_reference (std::atomic<int>& variable, int n) { for (int i=0; i<n; ++i) ++variable; }

struct C : std::atomic<int> {
  C() : std::atomic<int>(0) {}
  void increase_member (int n) { for (int i=0; i<n; ++i) fetch_add(1); }
};

int main ()
{
  std::vector<std::thread> threads;

  std::cout << "increase global counter with 10 threads...\n";
  for (int i=1; i<=10; ++i)
    threads.push_back(std::thread(increase_global,1000));

  std::cout << "increase counter (foo) with 10 threads using reference...\n";
  std::atomic<int> foo(0);
  for (int i=1; i<=10; ++i)
    threads.push_back(std::thread(increase_reference,std::ref(foo),1000));

  std::cout << "increase counter (bar) with 10 threads using member...\n";
  C bar;
  for (int i=1; i<=10; ++i)
    threads.push_back(std::thread(&C::increase_member,std::ref(bar),1000));

  std::cout << "synchronizing all threads...\n";
  for (auto& th : threads) th.join();

  std::cout << "global_counter: " << global_counter << '\n';
  std::cout << "foo: " << foo << '\n';
  std::cout << "bar: " << bar << '\n';

  return 0;
}

类似这样 std::thread(&C::increase_member,std::ref(bar),1000)

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan