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

C++到底要怎么写

  •  
  •   racecoder · 2017-12-14 16:27:15 +08:00 · 4518 次点击
    这是一个创建于 2570 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各种莫名其妙的访问冲突,加上 Sleep();后就好了,时间也不一定相等,有的 50 就够了,有的要 200。虽然一两个没什么感觉,但是多了感觉程序好慢。

    想起了 C++从入门到放弃,我现在好难受。。。

    44 条回复    2018-02-23 22:18:40 +08:00
    whypool
        1
    whypool  
       2017-12-14 16:46:17 +08:00
    C 加加
    exch4nge
        2
    exch4nge  
       2017-12-14 16:47:57 +08:00
    LZ 找安慰的话,告诉楼主 C++ 算是我从零开始到基本入门用的时间最长语言,还是比较难学的,楼主加油。
    LZ 如果想解决具体问题,可以把具体情况写出来,只听描述无法给什么技术上的建议。
    acgnsstech
        3
    acgnsstech  
       2017-12-14 16:48:56 +08:00
    建议学 Q#
    kirigaya
        4
    kirigaya  
       2017-12-14 16:56:14 +08:00
    多线程编程?
    sbw
        5
    sbw  
       2017-12-14 16:56:45 +08:00
    访问冲突是什么,data race ?
    DOLLOR
        6
    DOLLOR  
       2017-12-14 16:59:06 +08:00
    Rust 欢迎你
    kexming250
        7
    kexming250  
       2017-12-14 16:59:31 +08:00
    具体问题?
    owenliang
        8
    owenliang  
       2017-12-14 17:03:29 +08:00
    学生党不踏实学习,竟然"sleep"。
    wevsty
        9
    wevsty  
       2017-12-14 17:05:03 +08:00
    访问冲突?
    是 VS 调试的时候提示的?那多半是你的代码有堆栈溢出或者错误使用了已经释放的资源之类的问题。
    多线程开发是比较容易遇到这样的问题的,仔细检查代码和仔细调试吧。
    lfmy
        10
    lfmy  
       2017-12-14 17:05:05 +08:00
    花时间好好理一下,基本都能解决
    racecoder
        11
    racecoder  
    OP
       2017-12-14 17:07:02 +08:00
    @exch4nge 谢谢,就是有点难受,感觉付出回报不成比例,越学越不会。
    @kirigaya 应该是吧,不是很清楚
    @sbw 我不知道 data race 是什么,其中一个具体点的例子就是 opencv 的方法读取一张图片,然后用第三方库提取图片中的特征值。读取完立刻调用提取方法的话,vs2015 中就会停止运行,提示访问冲突,debug 也看不到。参数只有两个未初始化的变量指针,一个 cv:Mat。但是停 200ms 就正常运行了。
    @kexming250 见上
    HarrisonZ
        12
    HarrisonZ  
       2017-12-14 17:08:11 +08:00
    golang 欢迎你
    besto
        13
    besto  
       2017-12-14 17:10:40 +08:00
    @racecoder 加 sleep 能解决的问题,和语言没有任何关系。
    如果是硬件相关的 case,有时候硬件设置寄存器之后确实需要 sleep 一小会。
    像这种软件的 case,优先考虑这个方法是不是同步的,读读 API 文档怎么说的,别 API 是个 AIO 的,放进去当然立刻就返回了。
    liuminghao233
        14
    liuminghao233  
       2017-12-14 17:10:43 +08:00 via iPhone   ❤️ 4
    能用 sleep 处理线程同步的一般都是大佬
    cabing
        15
    cabing  
       2017-12-14 17:14:05 +08:00
    消灭--指向无效单元的指针。

    可以画个图锊一下逻辑。debug 跟踪下~~

    访问冲突 有没有使用 namespace 第三方包?特别是 c 的库~~
    fcten
        16
    fcten  
       2017-12-14 17:14:10 +08:00
    需要加 sleep 一般都是涉及到异步操作,初学者觉得加个 sleep 就好了,其实只是减小了冲突发生的几率
    这锅 c++不背,先学好基础吧……
    gamecreating
        17
    gamecreating  
       2017-12-14 17:15:14 +08:00
    Sleep????????那你还是好好学学吧
    zj299792458
        18
    zj299792458  
       2017-12-14 17:16:32 +08:00
    听着像是加个锁就能解决的东西。
    racecoder
        19
    racecoder  
    OP
       2017-12-14 17:20:42 +08:00
    @besto api 写的很简单,就说了怎么用,然后有个 demo。不过应该不是 api 的问题,毕竟提取特征的方法在好几个地方用到了,却只有固定的一处会出异常。
    @liuminghao233
    @fcten 没有让 C++背锅啊,只是觉得代码好难写啊
    besto
        20
    besto  
       2017-12-14 17:24:13 +08:00
    @racecoder 没 code,没 API,没真相。
    racecoder
        21
    racecoder  
    OP
       2017-12-14 17:29:51 +08:00
    @besto 抱歉,公司的项目,api 也是第三方的 sdk,所以我不能贴出来。感谢你那么想帮我,我只能想说说写 C++的感受。。。羡慕会 C++的大佬们。
    skadi
        22
    skadi  
       2017-12-14 17:38:34 +08:00
    加个 sleep...
    我猜是多线程的问题吧.
    gamexg
        23
    gamexg  
       2017-12-14 18:33:50 +08:00 via Android
    @liuminghao233 想起了单片机模拟多线程...
    Kilerd
        24
    Kilerd  
       2017-12-14 18:49:11 +08:00
    rust 欢迎你
    framlog
        25
    framlog  
       2017-12-14 19:00:58 +08:00
    rust 欢迎你+1
    codecooker
        26
    codecooker  
       2017-12-14 19:05:52 +08:00
    多线程抢占资源,你这样解决不了实际问题的。加个互斥锁吧,或者选一个线程安全的资源类型
    wwqgtxx
        27
    wwqgtxx  
       2017-12-14 19:19:39 +08:00
    @gamexg 那不都是一个大循环然后一大坨 switch 分支,尽量拆解每个工作让他看起来同步嘛,其实原理很类似于 Python 中用 yield 实现协程
    MeteorCat
        28
    MeteorCat  
       2017-12-14 19:22:41 +08:00 via Android
    推荐 Golang 入门,进阶 C/C'+
    racecoder
        29
    racecoder  
    OP
       2017-12-14 19:25:49 +08:00
    我就不一一 at 了。谢谢你们那么贴心的推荐,但是我已经学了 Java 了……,因为项目需要才临时学的 C++。暂时还没打算学那么多语言,毕竟 Java 还没搞明白。
    MeteorCat
        30
    MeteorCat  
       2017-12-14 20:00:54 +08:00 via Android
    推荐 Golang 入门,进阶 C/C+
    acros
        31
    acros  
       2017-12-14 20:23:47 +08:00 via iPhone
    从 java 到 c++?
    估计在 c++里面对 new 和 delete 时机没弄清,说的访问冲突是内存泄漏问题吧。c
    lrxiao
        32
    lrxiao  
       2017-12-14 23:47:41 +08:00
    只能说这锅 C++不背...不过 Rust fearless concurrency 可以一试
    lsmgeb89
        33
    lsmgeb89  
       2017-12-14 23:57:53 +08:00
    好好学学多线程编程,sleep 的话太业余了。
    z1s23
        34
    z1s23  
       2017-12-15 00:16:22 +08:00 via iPhone
    少用高级特性,把 C++当成 C 用,会少很多问题,以前做图像处理用的 halcon 的商业 SDK,集成的时候用 C++发现开发效率低,当时部门熟练使用 C++的就我一个,后来改用 C#,开发效率高很多,而且同事上手也快,最后变成了 C#+图像算法+图像库的模式
    we2ex
        35
    we2ex  
       2017-12-15 00:29:12 +08:00 via Android
    😂C++就不是一门能临时学的语言啊
    bramblex
        36
    bramblex  
       2017-12-15 09:21:41 +08:00
    不是一个加锁的队列就能解决你的问题
    lanry
        37
    lanry  
       2017-12-15 09:30:12 +08:00
    和 C++貌似没什么关系呀
    fuzhuo233
        38
    fuzhuo233  
       2017-12-15 09:59:12 +08:00
    我感觉学 C++最好是学 QT 带着学 C++,这样容易有产出还好玩,纯玩一些算法命令行啥的很难静下心来一直玩的
    ioth
        39
    ioth  
       2017-12-15 10:08:43 +08:00
    @lanry 他觉得有就有了,用汇编就没有关系了。
    c 还不是一样。
    GeruzoniAnsasu
        40
    GeruzoniAnsasu  
       2017-12-15 10:19:04 +08:00   ❤️ 1
    “ opencv ” “提取特征”

    估计也是算法方面的,库和 api 是 c++接口。讲真这样的不要强求自己往学会写 c++代码上靠,就当做 c 来写反而不会出什么问题,对于算法类的程序来说,用 1k 行流水账 baby code 实现要比用一大堆 c++特性又是容器又是 trait 又各种 move 智能指针写完不过瘾再 future 并发一轮好得多,写出来又没人看得懂,看得懂的人说不准当魔法越玩越黑最后只剩 magic code 虽然不知道怎么回事但好像就是能对最后谁都不敢动。

    对于从其它语言,特别是 C 转过来的人,我一般只劝他们把函数写进类里然后 static 掉,全局变量你给我放类里 static 掉,其它正常的 oo 语言转过来的( java )什么,c with class 模式能写熟练已经谢天谢地了,你实在对性能没什么概念就尽量多传指针,对,多传指针,跟你熟知引用是差不多的,释放的问题裸 delete 就裸吧裸能解决问题总比多线程智能指针+容器莫名其妙的多次析构好得多,大不了多几把锁,反正线程运行的时候又不干预,释放的时候保护冗余一点没什么大不了的

    RAII 我都不指望你知道字面意思了,别忘记把基类析构 virtual 就行

    在 c++里线程其实还是相当原始,异步和多线程下并发要格外小心
    hyq
        41
    hyq  
       2017-12-15 10:24:50 +08:00
    有没有用过 mutex ?给不同线程需要访问的资源都用锁给保护下
    racecoder
        42
    racecoder  
    OP
       2017-12-15 11:28:38 +08:00
    @GeruzoniAnsasu 我现在能把程序跑起来已经很开心了,本来对 C++一点都不懂的,有需求要用人脸识别功能,就把原来的一个 MFC 程序改改,加上人脸的 SDK。不要说什么代码了,我连那些依赖的库和头文件都要搞半天。一下接触这么多东西,瞬间都懵逼了。。
    @hyq 没有,我去找找看怎么用
    gnaggnoyil
        43
    gnaggnoyil  
       2017-12-15 14:42:48 +08:00
    OpenCV 读入图像有异步的 API?我记得没有吧.LZ 你用的什么函数读入的图像
    fooofei
        44
    fooofei  
       2018-02-23 22:18:40 +08:00 via iPhone
    需要找人来分析代码
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2752 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:02 · PVG 21:02 · LAX 05:02 · JFK 08:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.