相关疑难解决方法(0)

什么是比赛条件?

编写多线程应用程序时,遇到的最常见问题之一是竞争条件.

我对社区的问题是:

什么是比赛条件?你怎么发现它们?你怎么处理它们?最后,你如何防止它们发生?

concurrency multithreading terminology race-condition

915
推荐指数
11
解决办法
54万
查看次数

什么是信号量?

信号量是一种经常用于解决多线程问题的编程概念.我向社区提出的问题:

什么是信号量,你如何使用它?

concurrency multithreading semaphore

326
推荐指数
10
解决办法
21万
查看次数

Mutex示例/教程?

我是多线程的新手,并试图了解互斥锁的工作原理.很多谷歌和我找到了一个体面的教程,但它仍然有一些怀疑它是如何工作的,因为我创建了自己的程序,其中锁定不起作用.

互斥体的一个绝对非直观的语法是pthread_mutex_lock( &mutex1 );,当看起来互斥锁被锁定时,我真正想要锁定的是其他变量.这种语法是否意味着锁定互斥锁会锁定代码区域,直到互斥锁被解锁?然后线程如何知道该区域被锁定?[ 更新:线程知道该区域被 内存屏蔽锁定 ].这种现象应该被称为临界区吗?[ 更新:关键部分对象仅在Windows中可用,其中对象比互斥锁更快,并且仅对实现它的线程可见.否则,临界区只是指由互斥锁保护的代码区域 ]

简而言之,您能否帮助解决最简单的互斥示例程序以及关于它如何工作的逻辑的最简单的解释?我相信这会帮助很多其他新手.

c c++ multithreading synchronization mutex

165
推荐指数
7
解决办法
23万
查看次数

什么是僵局?

编写多线程应用程序时,遇到的最常见问题之一是死锁.

我对社区的问题是:

  1. 什么是僵局?

  2. 你怎么发现它们?

  3. 你处理它们吗?

  4. 最后,你如何防止它们发生?

concurrency multithreading deadlock locking

143
推荐指数
6
解决办法
10万
查看次数

Swift错误:信号SIGABRT如何解决它

我只是Swift编码的初学者.我的想法很简单,这是一个带有两个按钮的应用程序.单击时,文本字段将更改其文本.在Main.StoryBoard中,我添加了一个文本字段和两个按钮.在ViewController.swift文件中.我这样写:

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var textfield: UITextField!
    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var button2: UIButton!

    @IBAction func action1(_ sender: UIButton) {
        textfield.text="you just clicked on button1"
    }
    @IBAction func action2(_ sender: UIButton) {
        textfield.text="you just clicked on button2"
    }
}
Run Code Online (Sandbox Code Playgroud)

它应该是好的.但是,出现错误,显示:

thread1:信号SIGABRT

在文件AppDelegate.swift行:

class AppDelegate: UIResponder, UIApplicationDelegate
Run Code Online (Sandbox Code Playgroud)

我的代码出了什么问题?

ios swift

40
推荐指数
7
解决办法
11万
查看次数

为什么只能安全地从信号处理程序中调用异步信号安全功能?

我仍然有点困惑,为什么接收信号并从该信号处理程序中调用非异步安全函数是不安全的.有人可以解释这背后的原因,并可能尝试给我一些参考资料,我可以跟着自己阅读更多内容吗?

换句话说,我问为什么在信号处理程序中调用printf是不安全的.是因为内部进程问题和可能的竞争条件导致两个可能的printf没有保护调用,或者是因为进程争用到同一个资源(在本例中为stdout).假设进程A中的线程正在调用printf而另一个线程接收该信号然后调用printf.可能是因为这里的内核不知道该怎么做,因为它无法区分这两个调用.

c++ linux multithreading signals c++11

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

如何正确使用队列和线程

我是队列和线程的新手,请帮助完成以下代码,在这里我尝试执行函数hd,我需要多次运行该函数,但仅在单次运行完成后

\n
import queue\nimport threading\nimport time\n\nfifo_queue = queue.Queue()\n\ndef hd():\n    print("hi")\n    time.sleep(1)\n    print("done")\n\n\nfor i in range(3):\n    cc = threading.Thread(target=hd)\n    fifo_queue.put(cc)\n    cc.start()\n
Run Code Online (Sandbox Code Playgroud)\n

电流输出

\n
hi\nhi\nhi\ndonedonedone\n
Run Code Online (Sandbox Code Playgroud)\n

预期输出

\n
hi\ndone   \nhi\ndone\nhi\ndone\xe2\x80\x8b\n
Run Code Online (Sandbox Code Playgroud)\n

python multithreading python-3.x

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

Laravel Scheduler 和 Cron - Laravel 如何知道不运行基于 daily()、hourly() 等的计划作业

在 Laravel 的内核中,我有:

protected $commands = [
    Commands\SendRenewEmails::class,
];

/**
 * Define the application's command schedule.
 *
 * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
 * @return void
 */
protected function schedule(Schedule $schedule)
{
    // $schedule->command('inspire')
    //          ->hourly();
    $schedule->command('renew:emails')
        ->daily();
}
Run Code Online (Sandbox Code Playgroud)

renew:emails如果我通过 Artisan 手动运行该函数,则上述函数将按预期工作。

在我的 crontab 中我有:

* */8 * * * cd /path-to-my-project && php artisan schedule:run >> /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

我让它每 8 小时运行一次,而不是每分钟运行一次* * * * *,因为这是为了测试而进行的,只是为了确保该任务不是每分钟运行一次。

那么Laravel如何知道何时在内核上运行日常工作,以及何时发生?

从这个设置(这似乎是 Laravel 中 cronjobs 的基本设置,但每分钟运行一次而不是每 8 小时运行一次)来看,没有日志(我可以看到),并且数据库中没有表来跟踪这一点。

因此,如果我将 cron 设置为 …

cron laravel

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

这个GCD实现了getter setter线程安全并且比@synchronized更好吗?objc

@interface ViewController ()
@property (nonatomic, strong) NSString *someString;
@end

@implementation ViewController

@synthesize someString = _someString;

- (NSString *)someString {
    __block NSString *tmp;
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        tmp = _someString;
    });
    return tmp;
}

- (void)setSomeString:(NSString *)someString {
    __block NSString *tmp;
    dispatch_barrier_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        tmp = someString;
    });
    _someString = tmp;
}
@end
Run Code Online (Sandbox Code Playgroud)

有人说它比@synchronized方式更好,因为所有的锁定都是在GCD中处理的.

multithreading objective-c thread-safety grand-central-dispatch ios

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

.NET如何实现互斥?

我理解互斥的概念.这里解释得非常好.

但现在我想知道互斥锁到底是什么.我的猜测是.NET正在采用一些原始的系统资源(甚至可能只是一个内存地址?)并将其包装在一个称为互斥锁的对象中.

有谁知道在.NET中如何实现互斥锁?

.net c# mutex

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

c ++理解多线程中的lock_guard和mutex

我不清楚互斥锁和锁是如何工作的.

我有一个对象(my_class),我在主线程中添加,删除和读取对象中的数据.在我的第二个帖子中,我想从我的对象中检查一些数据.问题是,在从第二个线程读取数据时,当我删除主线程中的对象时,它可能导致崩溃应用程序.

因此我在std::lock_guard<std::mutex> lock(mymutex)第二个帖子中创建.

我创建测试,并使用此lock_guard它永远不会崩溃.但我不知道我是否也需要在主线程中使用锁定.

问题是,当第二个线程锁定互斥锁并读取数据和主线程想要从对象中删除数据但没有锁定时会发生什么?否则,当主线程从对象中删除数据时,第二个线程想要锁定互斥锁并从对象读取数据会发生什么?

c++ multithreading mutex

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

一次只允许该方法执行一次

我认为这是相当简单的任务,但我真的找不到好的答案。我有一个类/方法,可以从不同的服务器下载文件,处理它们,并对数据库进行更改。问题是,它可以由管理员手动启动,我想防止该进程的多个实例同时运行。有什么简单的方法可以实现这一目标吗?

c# asp.net-core

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