为什么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>
答案 0 :(得分:7)
由于:
std :: atomic可以用任何TriviallyCopyable类型T实例化。
来源:{{3}}
和
std::is_trivially_copyable<std::shared_ptr<int>>::value == false;
因此,您无法使用std::atomic<>
实例化std::shared_ptr<>
。但是,自动内存管理在多线程中很有用,因此提供了这些重载。那些重载很可能不是无锁的(首先使用std::atomic<>
的一个重要因素);他们可能会使用锁来提供同步性。
至于你的第二个问题:是的。