这是我的代码:
class carl{
public:
int x;
carl(int y):x(y){
}
void compute(){
x++;
}
};
int main () {
carl c(5); //init
carl c2(5); //init
std::thread t1([&](){
for(int i = 0 ; i <50;i++)
c.compute();
}
);
std::thread t2([&](){
for(int i = 0 ; i <50;i++)
c2.compute();
}
);
t1.join(); //join
t2.join(); //join
std::cout<<c.x<<std::endl;
std::cout<<c2.x<<std::endl;
return 0;
}
输出
55
55
我知道数据竞争,如果两个线程都访问相同的资源,他们应该受到保护。但是,如果它是这样的话呢?我创建了两个名为carl
和c
c2
的实例,他们有自己的resources
。我创建了两个访问自己计算的线程。我的问题是:
奖金问题: 我打算实现多客户端文件传输。我的tcp ip是使用阻塞i / o和每个连接一个监听器实现的。我觉得使用锁定保护可能会减慢进程,因为一切都会排队。有什么好的算法/方法吗?
答案 0 :(得分:4)
因为两个线程都会严格访问自己的资源,这个线程是否安全且不需要锁?
是的,这是正确的。
是否意味着c和c2正在访问的计算函数具有不同的函数地址?
没有。不需要复制函数,因为每个函数调用都是独立的。只要它们操作的数据不在线程之间共享,就没有问题。
答案 1 :(得分:3)
是的,它是线程安全的,不需要锁定。他们没有访问相同的资源,因此没有任何数据竞争。您似乎理解这个概念,但是不愿意将其应用到您的代码中。为什么犹豫不决?
不一定。它们可以执行相同的功能(也就是说,两个线程的程序计数器可能会跳转到内存中的相同函数来执行)。
至于你的奖金问题......为此开了一个新问题......
答案 2 :(得分:1)
我会添加另一个回复,因为我发现对第2点的回复不满意。
- 既然两个线程都会严格访问自己的资源,这个线程是否安全且锁定是否必要?
醇>
是
- 是否意味着c和c2正在访问的计算函数具有不同的函数地址?
醇>
不,功能总是一样的。对于&#39;这个&#39;它们将有两个不同的值。指针,因此将对不同的数据采取行动