为什么存在shared_ptr的原子重载

时间:2016-06-30 02:13:00

标签: c++ c++11 shared-ptr smart-pointers

为什么shared_ptr所描述的std::atomic存在原子重载,而不是shared_ptr处理shared_ptr的专门化。似乎与C ++标准库的其余部分使用的面向对象模式不一致..

为了确保我做到了这一点,当使用#include <iostream> #include <iomanip> #include <fstream> #include <string> using namespace std; // Function prototypes void displayAllLines(ifstream &joke); // Display joke void displayLastLine(ifstream &punchline); // Display punchline int main() { ifstream jokeFile, punchLineFile; // Open the joke file jokeFile.open("joke.txt", ios::in); // Make sure the file actually opens if (!jokeFile) cout << "Error opening file." << endl; // Call on function to display the joke displayAllLines(jokeFile); // Close the joke file jokeFile.close(); // Open the punchline file punchLineFile.open("punchline.txt", ios::in); // Make sure the file actually opens if (!punchLineFile) cout << "Error obtaining the punchline, sorry :(." << endl; // Call on function to display punchline displayLastLine(punchLineFile); // Close the punchline file punchLineFile.close(); system("pause"); return 0; } // function to display the joke void displayAllLines(ifstream &joke) { string input; // Read an item from the file getline(joke, input); // Display the joke to the user while (joke) { cout << input << endl; getline(joke, input); } } // function to display the punchline void displayLastLine(ifstream &punchline) { string input; punchline.seekg(0L, ios::beg); // Fast forward to the end of the file punchline.seekg('/n', ios::cur); // rewind the the new line character getline(punchline, input); // Read the line cout << input << endl; // display the line } 来实现here时,我们需要通过这些函数对共享指针进行所有访问(读取和写入)吗?< / p>

1 个答案:

答案 0 :(得分:7)

由于:

  

std :: atomic可以用任何TriviallyCopyable类型T实例化。

来源:{{3}}

std::is_trivially_copyable<std::shared_ptr<int>>::value == false;

因此,您无法使用std::atomic<>实例化std::shared_ptr<>。但是,自动内存管理在多线程中很有用,因此提供了这些重载。那些重载很可能不是无锁的(首先使用std::atomic<>的一个重要因素);他们可能会使用锁来提供同步性。

至于你的第二个问题:是的。