Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何避免异步等待_Multithreading_Asynchronous_Nonblocking - Fatal编程技术网

Multithreading 如何避免异步等待

Multithreading 如何避免异步等待,multithreading,asynchronous,nonblocking,Multithreading,Asynchronous,Nonblocking,我有一个应用程序,需要查询数据库以获取/放置信息。我不能同步执行,因为它会阻止我的整个过程,直到函数返回 基本上,我有一些函数在某些点上运行一个或多个查询 fun stuff1 stuff2 stuff3 query1 stuff4 query2 stuff5 我可以在单独的线程中启动函数,但是我必须锁定所有东西以防止争用(我认为锁定可能很慢?) 我可以异步启动查询并监视它们,但是我必须拆分我的函数,并使用在查询结束时运行的回调

我有一个应用程序,需要查询数据库以获取/放置信息。我不能同步执行,因为它会阻止我的整个过程,直到函数返回

基本上,我有一些函数在某些点上运行一个或多个查询

fun
    stuff1
    stuff2
    stuff3

    query1
    stuff4

    query2
    stuff5
  • 我可以在单独的线程中启动函数,但是我必须锁定所有东西以防止争用(我认为锁定可能很慢?)

  • 我可以异步启动查询并监视它们,但是我必须拆分我的函数,并使用在查询结束时运行的回调

我对通用解决方案感兴趣,但我的平台是POSIX,数据库(不幸的是)是mysql

你会怎么做?你会怎么处理


谢谢您的时间。

取决于情况有多复杂。在一个简单的场景中,跨多个函数中断工作(这些函数作为查询的回调)将起作用,这是一个有效的解决方案。在一个更复杂的场景中,您需要一些依赖注入框架,比如spring。

有些模式已经被知道并使用了相当长的一段时间,我相信它们没有改变

  • 运行独立函数:使用不同的线程
  • 运行独立的函数,然后运行依赖于所有函数的函数:使用不同的线程并在最后连接它们-同步它们。我不知道POSIX,但在.NET中,我们有
    EventWaitHandle
    ,它可以等待多个线程,并在所有线程完成时通知
  • 运行相互依赖的函数:在单个后台线程上运行并链接回调。NET再次提供了
    任务
    链接,这使得读写代码更加简单。jquery现在提供了
    promise
    ,这是同样的东西

  • 您可以创建一个处理数据库查询队列的新线程。此线程将保存一个列表,其中包含要在数据库上执行的下一个操作,并可由以下函数访问:MyDatabaseQueue.PerformActionWhenFree(操作a,回调CallMebackWhenOne)。这个线程将负责一次创建一个查询线程。这样,您总是可以在队列中接收更多查询,并且一次只有一个数据库查询线程

    如果查询是紧密耦合的,您只需使用
    pthread\u create
    启动一个并行线程,然后在该线程上按顺序运行它们。因此,您的主线程不会被阻塞,您仍然不需要使用任何锁。

    @Aliostad我对一个通用解决方案感兴趣。它将是特定于平台的……使用CriticalSection(C#相当于代码锁定)不会(本身)导致性能下降。你觉得这会使系统变慢吗?此外,由于这更像是一个观点/一般范式问题,我是否可以建议在programmers.stackexchange.com网站上使用它?对于并发性,没有“通用解决方案”这样的东西。如果有,您选择的语言将集成解决方案。@thiton好的:-)我编辑并添加了详细信息。