V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
braineo
V2EX  ›  程序员

学习多线程以及 GUI 编程的正确姿势是?

  •  
  •   braineo · 2016-02-03 23:14:53 +08:00 · 5366 次点击
    这是一个创建于 3214 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Sorry 。昨天发了个贴在工作版没有求到答案。于是到这里再发一次。请各位多多指教。

    是这样的:
    LZ 在某个大公司供职二年文职工作之后,决意跳到互联网行业……
    一年来痛定思痛学习编程刷刷 leetcode ,没想到还真的跳成功了……

    自觉水平仍然太菜可能无法胜任,真对不起程序员这个名头。
    于是想趁过年期间入职之前再全脱产提高一下自己

    想请教一下 多线程(进程), Async ,还有 GUI 编程应该看点什么书提升自己?

    自己搜索了一下 直接看<操作系统>的建议很多
    我知道这个很重要,但是自己看了一下觉得看不懂概念的也很多而且比较偏理论?
    如果能有什么实践导向的我觉得可以学起来没有那么枯燥。
    因为个人学习经验上来看,先上理论的会出现看不下去的情况。但是实践过一次再看理论就会有种恍然大悟的感觉

    综上,请把各种书或者网站的推荐砸向我 :)谢谢
    60 条回复    2016-02-06 08:18:46 +08:00
    allenforrest
        1
    allenforrest  
       2016-02-03 23:25:35 +08:00
    你先说说你即将入职的工作是做哪方面的?桌面应用? iOS App ? Android App ?
    Mirana
        2
    Mirana  
       2016-02-03 23:27:02 +08:00
    确实光看理论会看不下去的,所以你入职要做的东西是什么?
    em70
        3
    em70  
       2016-02-03 23:27:50 +08:00 via iPhone
    既然要实践,为什么还要让人给你推荐书

    GUI 编程建议安装一个 Delphi ,不写一行代码就可以快速做出能运行的 win, mac, Android 界面,然后再慢慢学习给界面添加各种功能,很适合你的需求
    braineo
        4
    braineo  
    OP
       2016-02-03 23:29:33 +08:00
    @allenforrest 我觉得应该是桌面, Android 跟 iOS 我也不怎么会……
    braineo
        5
    braineo  
    OP
       2016-02-03 23:31:42 +08:00
    @Mirana 做桌面程序吧。其实没有明确地说,更像是 General hire?公司挺小的可能不会专职干一件事
    allenforrest
        6
    allenforrest  
       2016-02-03 23:32:25 +08:00   ❤️ 1
    @braineo Windows 下桌面开发还是跨平台,前者就找微软的书看把,后者可能是用 Qt ,可以看 C++ GUI programming with Qt
    braineo
        7
    braineo  
    OP
       2016-02-03 23:33:56 +08:00
    @em70 可能我表达得不太好。直接上确实是可以啊,但是不会踩上很多坑吗?如果看前人总结出来的经验去实践的话就可以少踩很多坑啦
    braineo
        8
    braineo  
    OP
       2016-02-03 23:35:14 +08:00
    @allenforrest 前者.Net 后者 C++ GUI programming with Qt ?好哒!谢谢
    hardware
        9
    hardware  
       2016-02-03 23:39:20 +08:00
    不用学那些乱七八糟的
    Html5+css+javascript 学会了就能去找工作了
    braineo
        10
    braineo  
    OP
       2016-02-03 23:42:30 +08:00 via iPhone
    @hardware 但是我准备去工作了啊
    zhpech
        11
    zhpech  
       2016-02-03 23:45:21 +08:00   ❤️ 1
    线程本来就是理论的东西吧,我当时直接上来写的时候一知半解,直到操作系统里的各种模型理论概念有了之后才理解了很多东西。《操作系统》确实很有用。

    GUI 编程?看楼主用什么语言吧。
    hardware
        12
    hardware  
       2016-02-03 23:48:11 +08:00   ❤️ 1
    @braineo 但还是推荐从这个开始入手,到时候找个东西把网页一包,就能成桌面软件、 IOS 、安卓软件了。
    braineo
        13
    braineo  
    OP
       2016-02-03 23:52:44 +08:00 via iPhone
    @zhpech 所以还是建议上 操作系统 吗?呃,其实 GUI 的话与其说是想要具体编程的教材 更加偏向于怎么设计 GUI 的架构 以及 线程?的总论一样的书。因为具体工具的书搜索的话其实出来的比较多,比较好找
    braineo
        14
    braineo  
    OP
       2016-02-03 23:55:02 +08:00 via iPhone
    @hardware 卧槽 这么厉害的。我不太懂这个,这样的网页的线程其实就是全在后端了前段的话只是起到了显示的作用吗?
    zhpech
        15
    zhpech  
       2016-02-03 23:55:40 +08:00   ❤️ 1
    @braineo 不是写客户端的 不清楚 GUI 方面的理论 指的是计算机图形学么?操作系统的话 多线程(多进程)本来也只是里面很小的一块,如果楼主不是对整个都感兴趣的话,也可以只看那些,一边理论一边就着实现生产者消费者和读者写者模型,基本上就妥妥的了(我们老师说实际生产中用到的最多的也就生产者消费者了……)
    snnn
        16
    snnn  
       2016-02-03 23:59:35 +08:00
    我能想到的书都是很老的书……
    braineo
        17
    braineo  
    OP
       2016-02-04 00:04:22 +08:00 via iPhone
    @zhpech 我搜出来的一些概念级信息是一个 GUI 如果只有一个线程?那么在处理长时间任务的时候 UI 就会卡住 要再开一个线程处理后面的东西还要保持前端的响应。但是如果内部的模块很多就要开很多线程去分别处理,就可能会产生很多问题(但是没说是什么问题...)
    就是说操作系统的多线程部分 跟 设计模式 可能比较接近我提问的意图?然后搞个什么上手实践
    braineo
        18
    braineo  
    OP
       2016-02-04 00:06:18 +08:00 via iPhone
    @snnn 老当益壮?本来应该也是早就解决掉的问题嘛……只是我比较弱逼...
    zhpech
        19
    zhpech  
       2016-02-04 00:15:35 +08:00 via Android   ❤️ 1
    @braineo 嗷这个和 GUI 没关系~主要还是进程、线程以及一些其他理论的东西,如果资源不进行共享的话,多线程没啥难度,资源共享见我上面说的,一本非常有名的书叫做现代操作系统(并且不断更新再办)

    我们这么想好啦,线程(或者进程,取决于最小单位)是个很单纯的小朋友,你叫他去画画,他就不能同时在那边打草稿计算,你让他先画直线,就不能再让他同时先去画圆,他必须画完了画,才能去打草稿,这样你就会很长一段时间觉得好无聊啊,怎么那么慢。

    这就是你说的那个栗子,然后你再多叫一个小朋友去计算呢,是不是能快一点,如果同时很多小朋友在计算,那会不会更快?但这就涉及了共享问题了(๑•̀㉨•́ฅ✧
    braineo
        20
    braineo  
    OP
       2016-02-04 00:24:58 +08:00 via iPhone
    @zhpech 所以我是没提问在点子上啊!终归还是多线程的问题然后绕回到了操作系统...

    共享问题是
    小朋友多了的话先算好的要等没算好的?
    还是最后还有一个小朋友要把计算结果合并起来?
    还是小朋友 A 不小心把小朋友 B 的计算结果盖过去了?
    zhpech
        21
    zhpech  
       2016-02-04 00:26:39 +08:00 via Android   ❤️ 1
    @braineo ……嗯,这些……操作系统里都会有说……怎么处理情况,协同工作
    braineo
        22
    braineo  
    OP
       2016-02-04 00:31:26 +08:00 via iPhone
    @zhpech 好哒……最后文科生还是要上 操作系统 这种教科书了。我下单硬啃去了……
    snnn
        23
    snnn  
       2016-02-04 00:37:25 +08:00   ❤️ 1
    @braineo 《 C++并行与分布式编程》。我刚搜了下,买不到了。虽然能找到电子版,但是我不觉得有人能在电脑上看完它。
    braineo
        24
    braineo  
    OP
       2016-02-04 00:39:28 +08:00 via iPhone
    @snnn 好哒!谢谢你!我先去搜搜……
    braineo
        25
    braineo  
    OP
       2016-02-04 00:46:40 +08:00 via iPhone
    @snnn 貌似英文还有卖的,但是挺贵的
    em70
        26
    em70  
       2016-02-04 01:19:20 +08:00
    @braineo 你这不是正确的学习方法,不去实践,书你肯定看不明白的,计算机是一门实践性极强的学科.至少你得有一个感性的认识,知道 EXE 是如何编译出来的吧,俗话叫:写 hello world. 现在的 IDE 工具和框架可以让任何没有基础的人通过拖动控件把把一个只有界面没有功能的空白程序运行起来
    braineo
        27
    braineo  
    OP
       2016-02-04 07:39:22 +08:00 via iPhone
    @em70 那你假设我现在有感性认知了,但我不想在多线程编程里再踩上前面无数人踩过的坑的情况下,什么叫正确的方法?
    archxm
        28
    archxm  
       2016-02-04 09:01:39 +08:00   ❤️ 1
    非常重要的一点, 不要怕踩坑. GUI 编程, 非常重要的一个知识点: 消息循环, 另外还有绘制, 其实任何控件都可以自己画出来, 当然, 一开始学习, 就用已有的控件, 如果深入研究, 可以了解下自绘
    asj
        29
    asj  
       2016-02-04 09:08:32 +08:00 via Android
    多线程简单,记得一件事就行了





    不要自己写多线程代码,你不会用到的
    zhuangzhuang1988
        30
    zhuangzhuang1988  
       2016-02-04 09:30:12 +08:00   ❤️ 1
    <Windows 并发编程指南> http://book.douban.com/subject/4214617/ 一本就够了. 涉及了基本你能遇到的线程模式.
    mko0okmko0
        31
    mko0okmko0  
       2016-02-04 10:03:51 +08:00   ❤️ 1
    一个提前概念.
    1.大部分的程式语言本质都不是一定需要桌面才能动的.
    然后为了让这些持式语言能写桌面程式.就有了 QT 这一类的"桌面应用开发工具包".
    2.每个人的推荐有不同角度与考量.我推荐的是最快入门跟生产力.
    做得出来能用才是重点.其他都其次.因为时间和金钱不会等你.
    3.除了传统的 GUI 执行绪+背景执行绪.还有种东西叫做 Actor/akka.
    很多语言都有 Actor/akka 的实现(他是一种概念).高性能.高并行.可跨机连机.
    但概念比较不线性.弄懂并熟悉后.你就会把执行绪这东西丢掉.

    只有 win 的需求:
    VS2015 果断完整安装,支持 C#/vb.net/F#/c/c++/JS/HTML/CSS/XML/...等语言.
    并可用外挂套件管理器.新增其他语言的支持
    VS 开专案的时候.选桌面应用程式专案.然后选语言.C#或 VB.NET 都很好入手.我个人推荐 C#.
    之后就看 C#/VB.net 的视窗程式设计的网站或书籍.
    C#/VB.net 有很多很潮的语法支持.使用后会上瘾.
    例如动态结构资料处理的 linq.自动并行计算的"Parallel For(each)"语法(linq 本身也有自动并行语法).
    在观念不清的情况下.C#跟 VB.net 的视窗应用程式专案.有一个作弊的语法.可让背景执行绪直接操作 GUI.

    win/linux/mac 桌面需求:
    果断学 QT......备选 JAVA(FX/awt/swing).但个人不看好 FX.
    QT 其实应该说是桌面应用工具包.所以 QT 可以搭配很多种语言.
    所以你应该搜寻 QT+"某程式语言" 看看是否有支持.有就可以开始了.
    某语言你就选你最熟的.
    不然就 python.因为入门快.只是 py 本身是单核心的.所以大量计算的需要用多点方法解决这个问题.
    py 可以搭配 C/C++...等速度较快的.也支持多核心的语言.
    所以你知道某问题需要 py 大量计算,记得你还有 C/C++...等程式语言可以混搭.
    不要太纠结 y 的单核心问题.搜寻 "py 多核心" 一堆快速解,最佳解.

    JAVA(awt/swing/FX)是 JAVA 为了桌面平台做的东西.不难用但这 3 个东西有重复.又常混在一起用.
    想厘清 awt/swing/FX.就去搜寻这三个字.会有史诗级的故事.
    嫌 C#/VB.net/JAVA 慢?py 都能接受那这些都不算慢了.所以高计算还是让 C/C++来吧.
    scala 是建立在 JAVA 的一种变种.核心偏向是 Actor/akka.可以 java/scala 互相引用.

    3 桌面又跨手机...果断要会网页.
    前端 html/css/js.后端 php/nodejs..等.后端只要能建立 http server 的语言都可以.不要限制自己的思想.
    FB 有出一东西叫 React.本身是一种网页前端框架.
    然后可以开发近原生的手机 APP.叫做 ReactNative.
    React(Native)的速度就是 JS 的速度.应该跟 py 算同一个等级.
    有人用 JS 做出高计算的框架.如果有 React(Native)的高计算需求.去 JS 社群问 JS 的高计算框架推荐.

    当你身边有巨人.就不要自己拿爬梯.
    除非你跟巨人不能沟通.
    em70
        32
    em70  
       2016-02-04 10:49:14 +08:00 via iPhone
    @braineo 别人说这是坑,你不经验证就相信并绕行了,说好听点就是缺乏独立思考能力,说难听点就是懒
    haoc
        33
    haoc  
       2016-02-04 11:31:40 +08:00   ❤️ 1
    线程,进程是操作系统提出的概念。如果要了解还是去看操作系统的书吧。如果要做并发编程要结合不同的语言来学习,因为每个语言的并发模型都不太一样。
    braineo
        34
    braineo  
    OP
       2016-02-04 12:13:50 +08:00
    @archxm 好的谢谢!
    braineo
        35
    braineo  
    OP
       2016-02-04 12:17:32 +08:00
    @asj 愿求详解?
    braineo
        36
    braineo  
    OP
       2016-02-04 12:19:47 +08:00
    @mko0okmko0 好想给你多发几个金币, 10 个实在太少了
    braineo
        37
    braineo  
    OP
       2016-02-04 12:21:33 +08:00
    @haoc
    原理性的→操作系统
    实际操作→每种语言的并发类的书或者文档

    是这种意思是吧?
    zhpech
        38
    zhpech  
       2016-02-04 12:25:09 +08:00
    不要怕踩坑……你会发现坑才是记得最牢的东西。

    我觉得虽然现在巨人足够大了,站在其基础上确实可以造很多东西,但真正消化和会用是两个境界,有些理论可能自己用不到,但对于未来很多东西的理解上是有非常大的助益的。

    然而如果只是要用一个工具,你可能觉得这是弯路,对于长期而言,我觉得是有好处的,个人看法,如果你觉得要避免坑,唯有打好基础了,那些是不该踩得坑,剩下的是新手必经之路……别人要是连这段都帮你走完了,那估摸着就是个搬运工了。

    (我又在口胡了,果断光速逃跑)
    braineo
        39
    braineo  
    OP
       2016-02-04 12:29:33 +08:00
    @em70 这么说吧。多线程的编程中(我还不会),怎么让两个线程不要相互干扰,怎么在他们之间传递消息,我觉得肯定已经有比较好的实践方法。直接上的话遇到问题要么是我重新发明这些方法,要么是使用一些二逼方法----俗称坑。但无论是哪个都是要耗费时间的,而时间是很富贵的。就像你做研究一样你不会把一个研究从头做起而是看别人的 paper 从别人的基础上做。如果任何研究都从头做起,说好听点叫做认真负责,说不好听点叫做二。
    iceleaf
        40
    iceleaf  
       2016-02-04 12:53:47 +08:00
    建议楼主先学 python ,然后了解 python 的所有 GUI 绑定,然后你就很快知道 GUI ,多线程是怎么回事儿了
    braineo
        41
    braineo  
    OP
       2016-02-04 13:02:45 +08:00
    @zhpech 见上一条回复。就是理论上的坑 实践的方法上求能不跳就不跳。简单的例子就是,有 quick sort 这种东西了,刷题的时候让你写一个搜索你要么重新发明一个 quick sort 或者 merge sort ,不然就 brute force sort.正常来说我不需要把 quick sort 的算法从新发明呀。但是就算知道原理在实现的时候肯定会有坑,那种是我想避免的
    Andiry
        42
    Andiry  
       2016-02-04 13:05:02 +08:00   ❤️ 1
    @braineo 最简单的方法:加锁。任何一本操作系统书上都会讲,原理很简单。 so 去看书。
    至于跳坑,那是无法避免的,我还没见过学习并发编程没踩过坑的人。
    Andiry
        43
    Andiry  
       2016-02-04 13:07:57 +08:00   ❤️ 1
    专门讲并发编程的书: perfbook ,多处理器编程的艺术
    zhpech
        44
    zhpech  
       2016-02-04 13:16:26 +08:00   ❤️ 1
    @braineo 呃……楼主有这点时间跟我们口胡这么多东西,早就把理论知识点看得差不多了吧,另外我以前也觉得什么 qsort ,数据结构都有现成的,为什么还要自己去写一遍,但是现在觉得他们都有助于理解很多东西,并且很锻炼思维,从坑中也收获颇多,你所谓的理论上的坑,不就是想得太多,看得太少么?

    自己想的算法同理,感悟更深刻。

    学而不思则罔,思而不学则殆。

    楼上所说的加锁确实是行之有效的方法,但锁到什么精度,对于效率是截然不同的,实践可能就会告诉你,加个锁就行了,但操作系统每个可能会告诉你,怎么锁更好,就是这个道理。

    同理,只有你自己鼓捣了东西之后你才会发现现有轮子的美。
    haoc
        45
    haoc  
       2016-02-04 13:17:09 +08:00   ❤️ 1
    @braineo 是的。。个人觉得一开始系统不用看太深入,了解基本概念和原理还有比较重要的问题就行了。因为大部分语言都对操作系统的线程有自己的抽象。
    还有,不要用**python/ruby** :p
    em70
        46
    em70  
       2016-02-04 14:00:36 +08:00 via iPhone
    @braineo 任何语言都内置多线程支持,哪需要你去考虑线程互斥,你亲手做一遍啥都明白了,连做一遍的能力都没有?你压根没入门,你知道吗,多线程是相对高级的应用,你先得学会爬
    louk78
        47
    louk78  
       2016-02-04 14:34:24 +08:00
    学 C++吧,多线程是 C++最基础的东西
    braineo
        48
    braineo  
    OP
       2016-02-04 15:23:02 +08:00 via iPhone
    @zhpech 楼主还没放假,楼主还在上班做文职工作,楼主上班没法看别的书但是可以口胡 2 分钟,楼主正在思而不学则 die
    asj
        49
    asj  
       2016-02-04 15:24:02 +08:00 via Android
    @em70 JavaScript 泪目
    braineo
        50
    braineo  
    OP
       2016-02-04 15:25:39 +08:00 via iPhone
    @em70 我知道是比较进阶的用法。我自己斤两自己惦记着,我也没提出过于泛泛的问题,你为啥觉得我不会爬啊?还是说在愉快地鄙视文科生?
    yuriko
        51
    yuriko  
       2016-02-04 15:38:50 +08:00   ❤️ 1
    lz 怎么提问显然是还没入门啊……

    多线程显然不是你现在需要考虑的问题
    入门过程中应该是思考:如何实现->逻辑正确->性能正确->体验优化
    多线程至少不是第一步需要考虑和学习的

    程序是个实践主导的领域,没有绝对正确的做法,只有合适与否。线程问题同样,连领域都不确定,具体场景也没有,让别人给你个设计指导,这不是说空话么,纸上谈兵的事情在很多实际场景中并不是一回事
    braineo
        52
    braineo  
    OP
       2016-02-04 16:02:39 +08:00
    @Andiry 好书啊。谢谢推荐
    braineo
        53
    braineo  
    OP
       2016-02-04 16:02:54 +08:00
    @yuriko 因为我还没入职啊
    braineo
        54
    braineo  
    OP
       2016-02-04 16:04:54 +08:00
    @iceleaf 太好了 LZ 已经学过 python 了可以跳过第一步了
    RqPS6rhmP3Nyn3Tm
        55
    RqPS6rhmP3Nyn3Tm  
       2016-02-04 19:47:30 +08:00 via iPad
    据说高手都是用纯 C 的?
    isnowify
        56
    isnowify  
       2016-02-04 22:28:12 +08:00 via iPhone
    head first 系列找来看看? 挺有趣的
    yuriko
        57
    yuriko  
       2016-02-05 07:52:42 +08:00
    @braineo 并没有说没入门不对

    而是说正因为你没入门,还不知道现在真正的关键在哪里,作为一个编程的入门者,完全还没有到需要考虑多线程的时候,你现在需要掌握的是如何在某一个具体实现领域深入下去,当你随随便便就能正确完善的实现功能时,自然会去考虑并发问题。
    所以你现在就属于步子太大扯着蛋的典范,让我觉得好想就是连加法还没做好的时候,觉得好多人大学高数要挂,于是就到处问别人微积分怎么做一样。

    而且,在不同语言,不同框架,不同应用场景,多线程 /进程,虽然原理大同小异,但实现的时候所考虑的细节却是不同的。
    zhpech
        58
    zhpech  
       2016-02-05 09:44:32 +08:00 via Android
    @yuriko 同感楼主有点浮躁……
    wizardforcel
        59
    wizardforcel  
       2016-02-05 19:26:17 +08:00 via Android
    gui 随便找本书就好了。(或者再看看设计方面的?)

    并发的相关内容应该在编程书讲线程书的时候也一起讲了,但是,国内的垃圾教材好像不怎么提及。既然你已经被垃圾教材坑了,现在最好的办法是《 apue 》和《七周七并发模型》。前者讲了线程和锁的基本设施,后者是各种架构上的用法。

    async 这种语言级别的特性,编程书怎么可能不讲?
    hqs123
        60
    hqs123  
       2016-02-06 08:18:46 +08:00
    windows 核心编程里面也有涉及多线程编程东西楼主可以看下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5328 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 118ms · UTC 08:00 · PVG 16:00 · LAX 00:00 · JFK 03:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.