相关疑难解决方法(0)

Java:再次通知()与notifyAll()

如果一个谷歌用于"区别notify()和之间notifyAll()",那么会弹出很多解释(将javadoc段落分开).这一切都归结为等待线程被唤醒的数量:一个进入notify()和全部进入notifyAll().

但是(如果我确实理解了这些方法之间的区别),总是只选择一个线程用于进一步的监视器获取; 在第一种情况下,由VM选择的一种情况,在第二种情况下由系统线程调度程序选择的一种情况.一般情况下,程序员都不知道它们的确切选择程序(在一般情况下).

那么notify()notifyAll()之间的有用区别是什么?我错过了什么吗?

java multithreading

364
推荐指数
13
解决办法
21万
查看次数

活锁的好例子?

我理解livelock是什么,但我想知道是否有人有一个很好的基于代码的例子呢?以代码为基础,我并不是说"两个人试图在走廊里相互过去".如果我再读一遍,我会失去午餐.

concurrency livelock

137
推荐指数
4
解决办法
6万
查看次数

锁定解锁的互斥锁的效率如何?互斥锁的成本是多少?

在低级语言(C,C++或其他)中:我可以选择在拥有一堆互斥(如pthread给我或者本机系统库提供的内容)或者对象的单个互斥之间.

锁定互斥锁的效率如何?即可能有多少汇编指令,以及它们花了多少时间(在互斥锁解锁的情况下)?

互斥量需要多少钱?真的有很多互斥体是一个问题吗?或者我可以在代码中抛出尽可能多的互斥变量,因为我有int变量并且它并不重要?

(我不确定不同硬件之间有多大差异.如果有,我也想了解它们.但大多数情况下,我对常见的硬件感兴趣.)

关键是,通过使用许多互斥体,每个互斥体只覆盖对象的一部分而不是整个对象的单个互斥体,我可以安全地使用许多块.我想知道我应该走多远.即我应该尽可能地尝试保护任何可能的块,无论多么复杂和多少互斥量这意味着什么?


关于锁定的WebKits博客文章(2016)与此问题非常相关,并解释了自旋锁,自适应锁,futex等之间的差异.

multithreading mutex locking blocking

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

我的自旋锁实现是否正确且最佳?

我正在使用旋转锁来保护非常小的关键部分.争用情况非常罕见所以自旋锁是比常规的互斥体更合适.

我目前的代码如下,并假设x86和GCC:

volatile int exclusion = 0;

void lock() {
    while (__sync_lock_test_and_set(&exclusion, 1)) {
        // Do nothing. This GCC builtin instruction
        // ensures memory barrier.
    }
}

void unlock() {
    __sync_synchronize(); // Memory barrier.
    exclusion = 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道:

  • 这段代码是否正确?它是否正确地确保互斥?
  • 它适用于所有x86操作系统吗?
  • 它也适用于x86_64吗?在所有操作系统上?
  • 它是最佳的吗?
    • 我已经看到使用比较和交换的自旋锁实现,但我不确定哪个更好.
    • 根据GCC原子内置文档(http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html),还有__sync_lock_release.我不是记忆障碍的专家,所以我不确定我是否可以使用它而不是__sync_synchronize.
    • 我正在针对没有争用的情况进行优化.

我不在乎在所有有关争.有可能是1,也许2其他线程试图每过一次锁自旋锁.

c concurrency multithreading mutual-exclusion spinlock

37
推荐指数
2
解决办法
4万
查看次数

TThread.Synchronize 导致表单冻结

我正在检查如何以安全模式从线程写入备忘录。问题是,当使用TThread.Synchronize它时,表单会冻结,而没有它,表单就可以正常工作。

这是冻结的代码:

procedure TestThread;
var
  x : Integer;
begin
  for x := 0 to 2 do
  begin
    TThread.CreateAnonymousThread(
    procedure
    begin
      while True do
      begin
        TThread.Synchronize(TThread.CurrentThread, procedure
        begin
          //CritLock.Acquire;
          try
            Form1.Memo1.Lines.Add('Add to Memo ' + IntToStr(GetTickCount));
          finally
            //CritLock.Release;
          end;
        end);
      end;
    end).Start;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

这里是不冻结的代码:

procedure TestThread;
    var
      x : Integer;
    begin
      for x := 0 to 2 do
      begin
        TThread.CreateAnonymousThread(
        procedure
        begin
          while True do
          begin
            //CritLock.Acquire;
            try
              Form1.Memo1.Lines.Add('Add to Memo ' + IntToStr(GetTickCount));
            finally
              //CritLock.Release;
            end;
          end; …
Run Code Online (Sandbox Code Playgroud)

delphi tthread

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