在C下实现multithreading应用程序

我正在实施一个像MySQL这样的小型数据库。它是大型项目的一部分。

现在我已经devise了核心数据库,我的意思是我已经实现了一个parsing器,我现在可以在我的数据库上执行一些基本的SQL查询..它可以存储,更新,删除和检索文件中的数据..截至目前罚款..但是我想在networking上实现这一点..

我希望不止一个用户能够访问我的数据库服务器并同时对其执行查询…我正在Linux下工作,所以现在没有可移植性的问题..

我知道我需要使用套接字是好的..我也知道我需要使用像线程池这样的概念,我将需要创build最大线程数,然后为每个客户端请求唤醒一个线程和分配它给客户..

至于现在我无法弄清楚是如何将所有这些实际上捆绑在一起..我应该在哪里实现multithreading..在客户端/服务器端。 我的parsing器将如何被configuration为分别从每个客户端获取input?(主要是通过我认为的文件?)

如果任何人有想法如何我可以实施这个请告诉我bcos我卡在这里的项目…

谢谢.. :)

如果还没有,请参考Beej的“网络编程指南”,以便在一些套接字编程中弄脏你的手。

接下来,我将以流客户端和服务器为例,并将其用作单线程查询系统。 一旦你有了这个,你需要选择是否实际使用线程或使用select() 。 我的直觉说,你的磁盘数据库还不支持并行写入(可能是读取),因此单服务器线程服务请求可能是您的最佳选择!

在多客户端模型中,您可以使用客户端信息的简单的每插槽哈希表,并在处理查询时立即返回任何结果。 一旦你使用网络和数据库查询进行线程化,它会变得非常复杂。 因此,从单个客户端开始,为多个客户端添加轮询,然后开始阅读并处理线程(可能带有pthread )客户端 – 服务器模型。

服务器端,因为它是唯一可以理解信息的人。 您需要设计锁定或想出自己的模型,以确保修改/编辑不会影响获得服务的人员。

作为多线程的替代方案,您可以考虑基于事件的单线程方法(例如使用poll或epoll)。 一个非常快速的(非SQL)数据库的一个例子是使用这种方法是redis。

这种设计有两个明显的缺点:你只使用一个单一的CPU核心,冗长的查询会阻塞其他客户端一个明显的时间。 但是,如果查询速度相当快,没有人会注意到。

另一方面,单线程设计具有自动序列化请求的优点。 没有歧义,不需要锁定。 阅读(或另一个写)之间没有写入可以进来,它只是不能发生。
如果你的数据库中没有内建的健壮的MVCC(或者至少可以在其中工作),知道你不用担心会是一个巨大的优势。 并发读取不是一个问题,而是并发读写。

或者,您可以考虑在一个线程中执行输入/输出和语法检查,并在另一个线程中运行实际查询(通过队列传递查询)。 这也将消除同步的困扰,它至少会提供一些延迟隐藏和一些多核心。