c#是否有自己的java"synchronized"关键字版本?
即在java中,它可以指定为函数,对象或代码块,如下所示:
public synchronized void doImportantStuff() {
// dangerous code goes here.
}
Run Code Online (Sandbox Code Playgroud)
要么
public void doImportantStuff() {
// trivial stuff
synchronized(someLock) {
// dangerous code goes here.
}
}
Run Code Online (Sandbox Code Playgroud) 我已经达到了我的项目中的一个要点,它需要在可以写入的资源上的线程之间进行通信,因此同步是必须的.但是,除了基本级别之外,我并不真正理解同步.
考虑此链接中的最后一个示例:http://www.bogotobogo.com/cplusplus/C11/7_C11_Thread_Sharing_Memory.php
#include <iostream>
#include <thread>
#include <list>
#include <algorithm>
#include <mutex>
using namespace std;
// a global variable
std::list<int>myList;
// a global instance of std::mutex to protect global variable
std::mutex myMutex;
void addToList(int max, int interval)
{
// the access to this function is mutually exclusive
std::lock_guard<std::mutex> guard(myMutex);
for (int i = 0; i < max; i++) {
if( (i % interval) == 0) myList.push_back(i);
}
}
void printList()
{
// the access to this function …Run Code Online (Sandbox Code Playgroud) 我在具有以下属性的集合之后:
BlockingCollection<T>.TryAdd(T)完美相同的方法,即如果已达到最大元素数,它将返回falseConcurrentDictionary将是完美的,即通过键识别元素的能力,删除任何项目(不仅仅是第一个或最后一个,我认为这将是限制BlockingCollection)在我试图推销自己之前,我的问题是:
BlockingCollection某种方式实现这个功能?最后,如果我确实需要尝试自己做,我应该考虑什么方法?它是简单的包裹Dictionary有locks?
使用示例: 具有参与人数限定限制的聊天室可以存储参与者的连接信息并拒绝新参赛者,直到有足够的空间进入
在第5.5节,其读取和对某些类型的写入C#规格状态(即bool,char,byte,sbyte,short,ushort,uint,int,float,和引用类型)被保证是原子.
这激起了我的兴趣.你怎么能这样做?我的意思是,如果我希望读取和写入看起来是原子的,那么我个人的低级体验只能让我锁定变量或使用障碍; 如果必须为每一次读/写操作完成,那将是一个性能杀手.然而,C#做了类似的效果.
也许其他语言(如Java)可以做到这一点.我真的不知道.我的问题并不是特定于语言,只是我知道C#做到了.
我知道它可能必须处理某些特定的处理器指令,并且可能无法在C/C++中使用.但是,我仍然想知道它是如何工作的.
[编辑]说实话,我相信读取和写入在某些条件下可能是非原子的,就像CPU可以访问内存位置而另一个CPU在那里写入.这是否只会在CPU无法一次处理所有对象时发生,例如因为它太大或者内存未在正确的边界上对齐?
我在这里看到了一些示例,例如使用一个Event停止线程,我认为布尔标志可以完成这项工作.
class MyThread(threading.Thread):
def __init__(self):
self._please_stop = threading.Event()
def run(self):
while not self._please_stop.is_set():
[...]
def stop(self):
self._please_stop.set()
Run Code Online (Sandbox Code Playgroud)
class MyThread(threading.Thread):
def __init__(self):
self._please_stop = False
def run(self):
while not self._please_stop:
[...]
def stop(self):
self._please_stop = True
Run Code Online (Sandbox Code Playgroud)
Event在这里使用一个有什么好处?它的wait方法没有使用.是什么让它比布尔标志更好?
如果Event在多个线程之间共享相同的内容,我可以看到这一点,否则,我不明白.
这个邮件列表线程表明它Event会更安全,但我不明白为什么.
更准确地说,我不明白这两段:
如果我正确理解了GIL,它会同步对Python数据结构的所有访问(例如我的布尔'终止'标志).如果是这种情况,为什么还要为此目的使用threading.Event呢?
GIL是一个实现细节,依靠它来为您同步事物不是未来的.你可能会有很多警告,但使用threading.Event()并不是更难,而且从长远来看它更正确,更安全.
我同意使用Event添加几乎没有开销,所以我可以坚持,但我想了解标志方法的局限性.
(我正在使用Python3,所以我不关心Python2的限制,如果有的话,尽管这些在这里完全值得一提.)
我有一个枚举TimeFrame有类似的值:Yesterday,LastWeek,NextMonth等.
我正在尝试编写一个接收a的方法,TimeFrame并返回该段时间的开始和结束日期.
我查看了新的Java 8 Period类,它可以占用开始时间和结束时间,但似乎没有任何干净的方法来检索这些值.
如果不使用List(似乎是错误的数据结构)或一些丑陋的日期时算术,我怎么能干净地立即返回开始和结束日期?
"原子"和"同步"是指同一个东西还是有一些微小的差异?
看看这个问题的答案,我认为我的问题的答案是肯定的,他们是同义词.以下是否真的如此?
c# ×3
atomic ×2
java ×2
.net ×1
asynchronous ×1
c++ ×1
date ×1
datetime ×1
icollection ×1
java-8 ×1
period ×1
python ×1
synchronous ×1
time ×1