#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <chrono>
using namespace std;
atomic<int> i = 0;
void iplusplus() {
int c = 10000000; //循环次数
while (c--) {
i++;
}
}
int main()
{
chrono::steady_clock::time_point start_time = chrono::steady_clock::now();//开始时间
thread thread1(iplusplus);
thread thread2(iplusplus);
thread1.join(); // 等待线程1运行完毕
thread2.join(); // 等待线程2运行完毕
cout << "i = " << i << endl;
chrono::steady_clock::time_point stop_time = chrono::steady_clock::now();//结束时间
chrono::duration<double> time_span = chrono::duration_cast<chrono::microseconds>(stop_time - start_time);
std::cout << "共耗时:" << time_span.count() << " ms" << endl; // 耗时
system("pause");
return 0;
}
g++ -pthread test3.cpp -o t3
test3.cpp:8:17: error: use of deleted function ‘std::atomic<int>::atomic(const std::atomic<int>&)’
8 | atomic<int> i = 0;
| ^
In file included from test3.cpp:4:
/usr/include/c++/10/atomic:759:7: note: declared here
759 | atomic(const atomic&) = delete;
| ^~~~~~
/usr/include/c++/10/atomic:763:17: note: after user-defined conversion: ‘constexpr std::atomic<int>::atomic(std::atomic<int>::__integral_type)’
763 | constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
编译错误是因为你使用了被删除的拷贝构造函数`std::atomic<int>::atomic(const std::atomic<int>&)`,它用来防止原子类型被意外复制。
上面代码中,你使用了拷贝初始化的语法`atomic<int> i = 0;`,
它相当于`atomic<int> i = atomic<int>(0);`,这就会调用被删除的拷贝构造函数,导致错误。
可以使用直接初始化的语法`atomic<int> i(0);`或者列表初始化的语法`atomic<int> i{0};`,它们不会调用拷贝构造函数,而是调用其他的构造函数,如`constexpr atomic(__integral_type __i) noexcept`。
例如,你可以这样修改你的代码:
#include <atomic>
#include <iostream>
int main()
{
std::atomic<int> i(0); // 直接初始化
std::atomic<int> j{0}; // 列表初始化
std::cout << i << " " << j << std::endl;
return 0;
}
这样就可以解决你的错误,让你的程序正常编译和运行。
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <chrono>
using namespace std;
atomic<int> i = {0};//列表初始化,不调用拷贝构造函数
void iplusplus() {
int c = 10000000; //循环次数
while (c--) {
i++;
}
}
int main()
{
chrono::steady_clock::time_point start_time = chrono::steady_clock::now();//开始时间
thread thread1(iplusplus);
thread thread2(iplusplus);
thread1.join(); // 等待线程1运行完毕
thread2.join(); // 等待线程2运行完毕
cout << "i = " << i << endl;
chrono::steady_clock::time_point stop_time = chrono::steady_clock::now();//结束时间
chrono::duration<double> time_span = chrono::duration_cast<chrono::microseconds>(stop_time - start_time);
std::cout << "共耗时:" << time_span.count() << " ms" << endl; // 耗时
system("pause");
return 0;
}
(1) "Use of deleted function" error with std::atomic_int. https://stackoverflow.com/questions/27314485/use-of-deleted-function-error-with-stdatomic-int.
(2) c++ - use of deleted function - std::atomic - Stack Overflow. https://stackoverflow.com/questions/25940654/use-of-deleted-function-stdatomic.
(3) c++ - error: use of deleted function - Stack Overflow. https://stackoverflow.com/questions/5966698/error-use-of-deleted-function.
(4) "Use of deleted function" error with std::atomic_int. https://stackoverflow.com/questions/27314485/use-of-deleted-function-error-with-stdatomic-int.
(5) c++ - use of deleted function - std::atomic - Stack Overflow. https://stackoverflow.com/questions/25940654/use-of-deleted-function-stdatomic.
(6) c++ - error: use of deleted function - Stack Overflow. https://stackoverflow.com/questions/5966698/error-use-of-deleted-function.
(7) error C2280: attempting to reference a deleted function (atomic<int>). https://stackoverflow.com/questions/29332897/error-c2280-attempting-to-reference-a-deleted-function-atomicint.