Strategi untuk menggunakan parameter lalai dan parameter pembolehubah fungsi C++ dalam persekitaran berbilang benang

WBOY
Lepaskan: 2024-04-23 08:48:01
asal
923 orang telah melayarinya

Pastikan anda mempertimbangkan isu keselamatan benang apabila menggunakan parameter lalai dan parameter variadik fungsi C++ dalam persekitaran berbilang benang. Parameter lalai: Jika parameter lalai tidak boleh diubah (seperti integer atau literal rentetan), ia selamat untuk benang kerana ia tidak boleh diubah suai. Parameter pembolehubah: Parameter pembolehubah boleh disalin ke storan setempat utas, dan setiap utas mempunyai salinan bebas untuk mengelakkan perlumbaan data.

C++ 函数默认参数和可变参数在多线程环境中的使用策略

Strategi untuk menggunakan parameter lalai dan parameter pembolehubah fungsi C++ dalam persekitaran berbilang benang

Apabila menggunakan parameter lalai dan parameter pembolehubah fungsi C++ dalam persekitaran berbilang benang, isu keselamatan benang perlu dipertimbangkan. Ini kerana kedua-dua parameter lalai dan parameter variadic disimpan dalam bingkai tindanan fungsi, dan jika berbilang benang memanggil fungsi yang sama pada masa yang sama, mereka mungkin menggunakan ruang memori yang sama, menyebabkan perlumbaan data.

Penggunaan parameter lalai selamat benang

Parameter lalai dimulakan apabila fungsi ditakrifkan dan disimpan di lokasi yang diketahui dalam bingkai tindanan fungsi. Oleh itu, jika parameter lalai tidak boleh diubah (seperti integer atau literal rentetan), ia selamat untuk benang kerana ia tidak boleh diubah suai.

int sum(int a, int b = 0) {
  return a + b;
}
Salin selepas log masuk

Dalam contoh di atas, b ialah parameter lalai yang tidak boleh diubah dan oleh itu selamat digunakan dalam persekitaran berbilang benang. b 是一个不可变的默认参数,因此可以在多线程环境中安全使用。

可变参数的线程安全使用

可变参数存储在函数栈帧的动态分配的内存区域中。如果多个线程同时调用具有可变参数的函数,则它们可能會使用相同的内存空间,从而导致数据竞争。

为了解决这个问题,可以将可变参数复制到线程本地存储。线程本地存储是一个由编译器管理的特殊内存区域,每个线程都有自己的副本。

#include <thread>
#include <vector>

void sum_array(std::vector<int>& data) {
  int sum = 0;
  for (int x : data) {
    sum += x;
  }
  printf("Sum: %d\n", sum);
}

int main() {
  std::vector<int> data = {1, 2, 3, 4, 5};
  std::vector<std::thread> threads;

  for (int i = 0; i < 4; i++) {
    threads.emplace_back(sum_array, data);  // 每个线程拥有自己的 data 副本
  }

  for (auto& t : threads) {
    t.join();
  }

  return 0;
}
Salin selepas log masuk

在这个示例中,data 是一个可变参数,它被复制到每个线程的线程本地存储中。这样可以确保每个线程都有自己独立的 data

🎜Penggunaan parameter variadik selamat benang🎜🎜🎜Parameter pembolehubah disimpan dalam kawasan memori yang diperuntukkan secara dinamik bagi bingkai tindanan fungsi. Jika berbilang benang memanggil fungsi dengan argumen variadic secara serentak, ia mungkin menggunakan ruang memori yang sama, menyebabkan perlumbaan data. 🎜🎜Untuk menyelesaikan masalah ini, parameter variadik boleh disalin ke storan setempat utas. Storan tempatan benang ialah kawasan memori khas yang diuruskan oleh pengkompil, dan setiap utas mempunyai salinannya sendiri. 🎜rrreee🎜Dalam contoh ini, data ialah parameter variadik yang disalin ke storan setempat-benang setiap. Ini memastikan bahawa setiap urutan mempunyai salinan bebas datanya sendiri, dengan itu mengelakkan perlumbaan data. 🎜

Atas ialah kandungan terperinci Strategi untuk menggunakan parameter lalai dan parameter pembolehubah fungsi C++ dalam persekitaran berbilang benang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan