相关疑难解决方法(0)

C#版的java的synchronized关键字?

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)

c# java multithreading synchronization

303
推荐指数
5
解决办法
17万
查看次数

std :: lock_guard示例,说明其工作原理

我已经达到了我的项目中的一个要点,它需要在可以写入的资源上的线程之间进行通信,因此同步是必须的.但是,除了基本级别之外,我并不真正理解同步.

考虑此链接中的最后一个示例: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)

c++ multithreading thread-safety

17
推荐指数
3
解决办法
2万
查看次数

线程安全收集与上限

我在具有以下属性的集合之后:

  • threadsafe:它将在asp.net中使用,多个客户端可以尝试同时添加,删除和访问成员
  • max elements:我希望能够在构造时设置上限,最大元素数
  • TryAdd:一种与BlockingCollection<T>.TryAdd(T)完美相同的方法,即如果已达到最大元素数,它将返回false
  • 类似于字典:在大多数其他方面,a ConcurrentDictionary将是完美的,即通过键识别元素的能力,删除任何项目(不仅仅是第一个或最后一个,我认为这将是限制BlockingCollection)

在我试图推销自己之前,我的问题是:

  1. 我是否错过了一个内置类型,它会对集合中的元素数量设置安全上限?
  2. 有没有办法以BlockingCollection某种方式实现这个功能?

最后,如果我确实需要尝试自己做,我应该考虑什么方法?它是简单的包裹Dictionarylocks

使用示例: 具有参与人数限定限制的聊天室可以存储参与者的连接信息并拒绝新参赛者,直到有足够的空间进入

.net c# icollection

11
推荐指数
1
解决办法
1143
查看次数

C#如何保证读/写操作的原子性?

在第5.5节,其读取和对某些类型的写入C#规格状态(即bool,char,byte,sbyte,short,ushort,uint,int,float,和引用类型)被保证是原子.

这激起了我的兴趣.你怎么能这样做?我的意思是,如果我希望读取和写入看起来是原子的,那么我个人的低级体验只能让我锁定变量或使用障碍; 如果必须为每一次读/写操作完成,那将是一个性能杀手.然而,C#做了类似的效果.

也许其他语言(如Java)可以做到这一点.我真的不知道.我的问题并不是特定于语言,只是我知道C#做到了.

我知道它可能必须处理某些特定的处理器指令,并且可能无法在C/C++中使用.但是,我仍然想知道它是如何工作的.

[编辑]说实话,我相信读取和写入在某些条件下可能是非原子的,就像CPU可以访问内存位置而另一个CPU在那里写入.这是否只会在CPU无法一次处理所有对象时发生,例如因为它太大或者内存未在正确的边界上对齐?

c# atomic

9
推荐指数
2
解决办法
7722
查看次数

停止一个主题:标志与事件

我在这里看到了一些示例,例如使用一个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的限制,如果有的话,尽管这些在这里完全值得一提.)

python python-multithreading

7
推荐指数
2
解决办法
3757
查看次数

如何获得一段时间的开始和结束时间?

我有一个枚举TimeFrame有类似的值:Yesterday,LastWeek,NextMonth等.

我正在尝试编写一个接收a的方法,TimeFrame并返回该段时间的开始和结束日期.

我查看了新的Java 8 Period类,它可以占用开始时间和结束时间,但似乎没有任何干净的方法来检索这些值.

如果不使用List(似乎是错误的数据结构)或一些丑陋的日期时算术,我怎么能干净地立即返回开始和结束日期?

time datetime date period java-8

3
推荐指数
1
解决办法
2322
查看次数

编程中的"原子"和"同步"同义词是什么?

"原子"和"同步"是指同一个东西还是有一些微小的差异?

看看这个问题的答案,我认为我的问题的答案是肯定的,他们是同义词.以下是否真的如此?

  • 同步操作将在下一个操作开始之前完成
  • 原子操作与同步操作相同
  • 异步操作将在下一个操作开始之前或之后的某个时刻完成

java asynchronous atomic synchronous

1
推荐指数
1
解决办法
576
查看次数