拯救多线程混乱的 pelagia

2020-07-13 21:28:40 +08:00
 gantleman

全文地址: gameinstitute.qq.com/community/detail/133448

导致多线程混乱的依赖和死锁问题。

在介绍各种多线程开发工具前我先要介绍下多线程下最大的二个问题。

第一个问题就是任务执行的依赖关系。在不同线程间执行的任务代码会有先后次序的需求。但因为多线程的特性会导致这些代码被同时执行。那么需要一种方法来控制多线程间代码的依赖关系。违反这种依赖关系可能会导致数据的丢失。执行过程的严重错误。甚至崩溃,死机。

第二个问题就是死锁。 在多线程执行过程中,多个线程会访问同一个数据。如果其中一个线程锁住了一个数据,然后请求另一个数据的锁。而其他线程刚好锁住了他请求中的数据,并也刚好请求他拥有的数据。就会导致两个线程互相等待系统卡死的问题。

为什么多线程下这两个问题是核心问题? 因为这两个问题的出现与多线程软件规模成正比,也就是说随着多线程软件规模的增加,这两个问题出现的概率也在增加。他们像达克摩斯之剑一样悬挂在任何多线程项目的上空。

pelagia

是开源项目其地址在 github.com/surparallel/pelagia

pelagia 是由 surparallel open source 推出的开源项目,是唯一同时解决依赖和死锁的多线程工具。 在前面我简单的介绍了多线程工具的现状。我们知道依赖和死锁是多线程开发中必须要解决的两个问题。并不是简单的因为依赖和死锁会有概率的出现在多线程项目中。而是因为在多线程项目中存在指数规模效应的问题。

所谓指数规模效应是指假设一个项目有两个线程,如果你新添加一个线程,那么两个线程间发生依赖和死锁,就有 3 的 2 次方即 9 种可能。如果有 99 个线程,你同样是新添加一个线程,那么发生依赖和死锁的可能就变成了 100 的 2 次方种可能。也就是说可能发生依赖和死锁的状况,随着开发任务的增加成指数级别的增加。

这样就导致每开发一个新的线程任务就要和其余的线程任务做仔细的检查。检查是否可能出现依赖和死锁。而这种检查的规模也是程指数增加的。这样就导致我们开发的多线程项目很快就会达到团队所能承受的极限。

因为指数规模效应的存在就必然会有祖传代码拍死老师傅。为了避免老师傅们被祖传代码拍死。pelagia 结合消息通信和数据分区两个技术,同时解决依赖和死锁问题,彻底拯救了老师傅。

pelagia 目前处于准完成阶段。大部分功能已经开发完毕。包括消息通信的统计系统,支持多线程的日志系统,多线程数据分区的存储系统。其硬盘储存系统性能略快于 redis 。

12062 次点击
所在节点    程序员
39 条回复
VDimos
2020-07-19 11:31:34 +08:00
这个论坛用 c 的多线程,看起来不是很多呀
mightofcode
2020-07-20 10:56:48 +08:00
哦豁
jones2000
2020-07-22 01:00:19 +08:00
死锁了, 直接用 windbg 调试,导入对应的 pdb,是可以看到锁变量信息和对应上锁的代码函数调用。 不过这个是 windows 的调试方法。 其他平台就不清楚。
gantleman
2020-07-22 01:54:59 +08:00
@jones2000 死锁是工程不可控的表现。本质问题是工程的不可控,不可控就意味,今天不会出问题不代表永远不会出问题。一个人的项目不出问题不代表团队也不出问题。靠人力和调试可以解决这个问题,前提是可以调试的环境。多线程软件运行在汽车上,飞机上,火箭上。出现死锁就会造成巨大的财产损失。也不会有机会去调试。所以多线程的广泛应用就需要彻底消灭死锁的问题。
gantleman
2020-07-24 10:04:49 +08:00
@VDimos 目前支撑使用 c,c++,lua 。嵌入 js 也在开发中。
ihciah
2020-07-29 18:01:02 +08:00
看了很多 pelagia 的宣传,但是都感觉有点空啊?能讲讲实现原理或者细节吗?
Yut
2020-07-29 22:16:54 +08:00
不是,死锁完全就是代码设计问题,靠这种打补丁修有什么用嘛。
送老哥一句话
“Let it crash”
sgissb1
2020-07-29 22:37:23 +08:00
死锁的出现,一般有三种:
1,疏忽大意
2,根本不懂多线程是什么
3,不懂最基本的代码设计和模块排列,就装架构师,模仿设计模式搞事情,或者创造新的设计模式。

一般第一种也很多,但对于线程操作熟练工和代码模块设计和排列的熟练工来说,稍微好一点的代码习惯这个问题就会少很多。

现在不管 c 还是 c++程序员,第二种和第三种居多。因为 c/c++和 java 类开发工具的线程调度模型稍有区别,主要是没有类似 gc 等会打断线程的开发语言特性的软 /硬中断。

所以其线程相当接近硬件调度模型和操作系统调度模型的情况。做非嵌入式的,操作系统和硬件都稍微了解一些,在平时养成好一点的代码习惯,加上不要没事瞎装架构师,算法工程师,操练个 2-3 年的同时渐渐从上到下(指底层调度)的做个了解,基本没有太大问题。

工程问题在于取舍,而取舍在于经验,正确的经验积累在于正确正确的基础知识和踏实。可惜现在程序员和韭菜一样,一茬一茬的割,加上“我的代码拯救世界”的心态流行。本来很不算太难的事情,其实很难。
ysmood
2020-07-29 22:49:54 +08:00
一千星的项目一个 PR 都没有,全部 issue 都是作者自己创建的。我更希望能分享下推广的经验?
gantleman
2020-07-31 04:01:02 +08:00
@sgissb1 作为一个工具,需要在给定条件下能获得准确的结果。如果汽车在 80%的时间正常,20%的时间可能原地爆炸。在工程上又给不出爆炸的原因,那么汽车这个工具就是无法使用的工具。对于多线程来说排除死锁非常困难,导致多线程无法被广泛使用。首先就要解决需要人为因素介入的问题。在给定条件下保证多线程可以 100%正常运行。排除人为因素的干扰也是工具存在的意义之一。
gantleman
2020-07-31 04:25:14 +08:00
@ysmood 解决多线程问题是非常冷门的领域,在全世界关心这方面技术的人都非常少。激进的营销策略只是为了找到有共同兴趣的朋友一起分享开源技术。我做的工作哪怕最终只对很少的人有帮助,对我也是非常有意义的。做营销肯定要大嗓门喊出去,做事就要有做事的样子和觉悟。如果有冒犯之处请您多包含。
mind3x
2020-07-31 06:31:37 +08:00
看了一下官方示例 https://github.com/surparallel/pelagia/blob/master/src/psimple.c
只能说,这不像是写了十几年 C 啊:


static int TaskRouting(char* value, short valueLen) {
void* pEvent;
memcpy(&pEvent, value, valueLen);

这 memcpy 心够大的……
gantleman
2020-07-31 08:24:50 +08:00
@mind3x 请教问题具体指什么?
gantleman
2020-07-31 09:17:50 +08:00
@mind3x 你是第二个和我提 memcpy 不能这样用。但都没说为什么不能这样用,或者这样用会导致什么问题,或者标准的用法应该是什么。每个都能能力不足的地方,谢谢您指正我的问题。
tcfenix
2020-07-31 10:14:50 +08:00
@gantleman
不是很熟悉 C,所以想请教一下,memcpy 之前不需要 malloc 一下么?还是在 C 里面 void* pEvent;就会直接分配内存空间?
gantleman
2020-07-31 10:25:21 +08:00
@tcfenix 因为传进来的值就是指针,不用再分配堆空间了,直接复制到指针变量里就可以了。
sgissb1
2020-07-31 12:08:50 +08:00
@gantleman 意思说,如果你不是程序员,去造汽车,你也能保证 100%不原地爆炸?

你整个回复,就是在非给定条件下,汽车原地爆炸。在给定条件下,你线程 100%正常。不理解你想说什么
gantleman
2020-07-31 12:24:39 +08:00
@sgissb1 我的表达能力很差,写代码久了确实不太会和人相处。发明工具的目的是帮助程序员更好的使用多线程。降低多线程开发的使用门槛。
lwlizhe
2020-07-31 14:20:24 +08:00
这项目为啥 star 那么多,fork 那么少……

我这还一批 fork 了不点 star 的……
gantleman
2020-07-31 17:59:59 +08:00
@lwlizhe 对自己的项目有信心,当然就要花钱请公司帮忙推广呀!现在是金钱社会啦。美国总统拉选票都要做广告。你需要 star 的话我把广告公司的联系方式给你呀!国内各大公司都是他们的老客户。广告的钱还是要花的不能省。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/689717

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX