首页 新闻 会员 周边

多线程访问 Interlocked.Increment

0
[待解决问题]


代码中有很一段,不理解 Interlocked.Increment(ref numThreads); 的意思。

1,感觉不写好像也 没啥问题。。
2,百度说是 原子加 操作,是给numThreads 加锁么,那有什么时候解锁。。不解锁,其它函数调用还不行?
3,像lock(){ } 函数,可以理解锁了,然后执行里面的方法 ,,但这个就一个 值类型 numThreads,锁有什么必要么?
4,Interlocked.Decrement(ref numThreads); 这个是干嘛的?

代码部分:
static int numThreads;
public static Thread RunAsync(Action a)
{
Initialize();
while (numThreads >= maxThreads)
{
Thread.Sleep(1);
}
Interlocked.Increment(ref numThreads);
ThreadPool.QueueUserWorkItem(RunAction, a);
return null;
}

_阿成的主页 _阿成 | 菜鸟二级 | 园豆:202
提问于:2018-03-02 10:59
< >
分享
所有回答(3)
0

看看  操作系统   之   进程、线程、pv操作、锁等。

花飘水流兮 | 园豆:13560 (专家六级) | 2018-03-02 11:16

谢谢,已看过。但还是 不明白 Interlocked.Increment (ref  xx)的实现原理。。

支持(0) 反对(0) _阿成 | 园豆:202 (菜鸟二级) | 2018-03-02 11:22

@yixiaoerguo2hao: 你已经都猜到了。实际上你能想到多少种方法(你要相信自己的想的办法大多数时候都只是前人已经放到了那里的之一),意味着它就有好多种可能,毕竟处理解决的办法都是像你我一样的人想出来的。

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2018-03-02 11:39
0

Interlocked.Increment(ref numThreads); 这个只是对整数的锁,原子操作本身就是先锁,然后自己解锁,所以不存在如何解锁的问题,上面的这个片段可能不写问题也不大,这种原子操作主要处理多线程的并发的问题,由于整数加是多个指令,多个并发加时,如果不是原子操作,那可能有的线程就没有加上,这样就会有逻辑错误

 

lock这个是临界区锁,不过锁定的对象不同,粒度有差别

2012 | 园豆:21230 (高人七级) | 2018-03-02 11:38
1

在多线程环境中对一个变量进行读写时,需要有一种方法能够保证对一个值的递增操作是原子操作,即不可打断性,一个线程在执行原子操作时,其它线程必须等待它完成之后才能开始执行该原子操作,OS给我们提供了这样一些函数,比如这里的Interlocked.Increment(ref numThreads)。

JeffWong | 园豆:2328 (老鸟四级) | 2018-03-02 12:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册