C++ 更改多线程的共享变量c++;
我想知道是否有任何方法可以在c中实现从多个线程更改共享/全局变量++ 想象一下这个代码:C++ 更改多线程的共享变量c++;,c++,multithreading,C++,Multithreading,我想知道是否有任何方法可以在c中实现从多个线程更改共享/全局变量++ 想象一下这个代码: #include <vector> #include <thread> void pushanother(int x); std::vector<int> myarr; void main() { myarr.push_back(0); std::thread t1(pushanother, 2); t1.join(); } void
#include <vector>
#include <thread>
void pushanother(int x);
std::vector<int> myarr;
void main() {
myarr.push_back(0);
std::thread t1(pushanother, 2);
t1.join();
}
void pushanother(int x) {
myarr.push_back(x);
}
#包括
#包括
另一个(int x);
std::载体myarr;
void main(){
myarr.推回(0);
标准:螺纹t1(另一个,2);
t1.join();
}
无效推送另一个(int x){
myarr.推回(x);
}
我认为这正是解决您问题的完整示例:
我认为这正是解决您问题的完整示例:
在这种特殊情况下,代码(除非线程上缺少连接)出人意料地正常 这是因为
std::thread
的构造函数会导致内存限制操作,并且第一个线程不会修改或读取该限制之后的向量状态
实际上,您已经将向量的控制权转移到了第二个线程
但是,修改代码以表示更正常的情况需要显式锁定:
#include <vector>
#include <thread>
#include <mutex>
void pushanother(int x);
// mutex to handle contention of shared resource
std::mutex m;
// the shared resource
std::vector<int> myarr;
auto push_it(int i) -> void
{
// take a lock...
auto lock = std::unique_lock<std::mutex>(m);
// modify/read the resource
myarr.push_back(i);
// ~lock implicitly releases the lock
}
int main() {
std::thread t1(pushanother, 2);
push_it(0);
t1.join();
}
void pushanother(int x) {
push_it(x);
}
#包括
#包括
#包括
另一个(int x);
//用于处理共享资源争用的互斥
std::互斥m;
//共享资源
std::载体myarr;
自动推送(int i)->无效
{
//拿把锁。。。
自动锁定=标准::唯一锁定(m);
//修改/读取资源
myarr.推回(i);
//~lock隐式释放锁
}
int main(){
标准:螺纹t1(另一个,2);
推它(0);
t1.join();
}
无效推送另一个(int x){
推它(x);
}
在这种特殊情况下,代码(除非线程上缺少连接)出人意料地正常
这是因为std::thread
的构造函数会导致内存限制操作,并且第一个线程不会修改或读取该限制之后的向量状态
实际上,您已经将向量的控制权转移到了第二个线程
但是,修改代码以表示更正常的情况需要显式锁定:
#include <vector>
#include <thread>
#include <mutex>
void pushanother(int x);
// mutex to handle contention of shared resource
std::mutex m;
// the shared resource
std::vector<int> myarr;
auto push_it(int i) -> void
{
// take a lock...
auto lock = std::unique_lock<std::mutex>(m);
// modify/read the resource
myarr.push_back(i);
// ~lock implicitly releases the lock
}
int main() {
std::thread t1(pushanother, 2);
push_it(0);
t1.join();
}
void pushanother(int x) {
push_it(x);
}
#包括
#包括
#包括
另一个(int x);
//用于处理共享资源争用的互斥
std::互斥m;
//共享资源
std::载体myarr;
自动推送(int i)->无效
{
//拿把锁。。。
自动锁定=标准::唯一锁定(m);
//修改/读取资源
myarr.推回(i);
//~lock隐式释放锁
}
int main(){
标准:螺纹t1(另一个,2);
推它(0);
t1.join();
}
无效推送另一个(int x){
推它(x);
}
您应该使用互斥锁保护对myarr
的访问。还有join()
退出main()之前的线程。最后但可能并非最不重要的一点是,您缺少了pushOther()
的正向声明。简单示例代码:只是尝试谈论此处创建的错误,因为它在pushOther函数上中断。请将a与逐字错误文本一起发布。您的问题。您应该使用互斥锁保护对myarr
的访问。还有join()
退出main()之前的线程。最后但可能并非最不重要的一点是,您缺少了pushOther()
的正向声明。简单示例代码:只是尝试谈论此处创建的错误,因为它在pushOther函数上中断。请将a与逐字错误文本一起发布。你的问题,谢谢!代码似乎很有用,我只是在玩互斥,但是谢谢你的例子。谢谢!代码似乎可以工作,我只是在玩互斥的,但谢谢你的例子。