没有线程的并发

时间:2016-02-04 03:38:00

标签: c multithreading concurrency distributed-computing

我有这个单一的单片守护程序,它可以执行多个操作,例如与北界API连接,与南边API连接,执行状态机,构建内部数据库。

目前我最终遇到了可伸缩性问题,我想重新设计守护进程,以便守护进程内的所有多个操作都是并发的。但是使用线程会使逻辑变得复杂,因为我最终不得不:

  • 添加锁以进行同步。
  • 妥善照顾未来的扩展。
  • 调试时间问题。

所以我的问题是请建议一种设计方法,我仍然可以使操作并发并消除线程的复杂性。

我的应用程序目前在C中。任何示例开源(FOSS)项目都可以帮助我理解设计方法。

3 个答案:

答案 0 :(得分:0)

您剩下的唯一选择是:

  • 多进程方法(即:spawn()fork()exec()等。您仍然需要同步数据,设置共享内存等。线程可能会更容易)。
  • 咬紧牙关,没有并发生活。
  • 精通"lock free / lockless programming" approaches,至少仍可能需要原子操作。

软件同步,保护和面向未来/可扩展性是执行非平凡操作的任何生产代码中的常见问题。试图完全避免它们通常表明你比避免使用线程模型有更大的顾虑。

答案 1 :(得分:0)

这听起来像是一个完美的案例,它提供了基于Hoare的通信顺序进程(CSP)*的并发模型。幸运的是,您不必使用go来获取CSP。 ZeroMQ成名的Martin Sustrik给了我们libmill,它提供了C中的并发原语。不过,你可以考虑去寻找其他功能。

*我没有尝试直接描述CSP,而是建议你观看一些Rob Pike的优秀视频,例如:Go Concurrency Patterns

答案 2 :(得分:0)

在不运行多个线程的情况下实现异步执行的一种方法是使用命令模式和命令队列。您可以使用任何编程语言实现它。当然事情并不是真正并行执行,但这是在资源非常有限的环境中进行异步编程的方法。 Robect C Martin在他的video中很好地描述了这一点。

示例场景:

  • 您向队列添加了一个初始命令(为了示例,它只是一个简单的命令)。
  • 你开始无限循环只做一件事:
    1. 从队列中取出下一个命令
    2. 对当前线程执行命令
  • 我们的命令(让我们称之为CheckButtonPressed)可以做一些简单的检查(例如,如果点击按钮或某些Web服务响应了某些值)
    • 如果条件检查是否定命令,则会将自身添加回队列(队列永远不会为空,如果按下按钮,我们会一直检查)
    • 如果条件检查是肯定的,我们将HandleButtonClick命令添加到队列中,该命令包含我们想要响应此事件的任何代码。
  • 当处理HandleButtonClick命令时,它将执行所需的任何代码,最后它会再次将CheckButtonPressed添加到队列中,以便再次按下该按钮,队列永远不会为空。< / LI>

如您所见,除了初始命令(在开始队列处理循环之前添加到队列中的命令)之外,所有其他命令都会被其他命令添加到队列中。命令可以是有状态的,但不需要线程同步,因为只有一个线程。

相关问题