TC官方合作论坛

标题: 内存不能为read的问题 [打印本页]

作者: tobydu    时间: 2014-4-11 15:17
标题: 内存不能为read的问题
我全局变量定义了数组
namespace xxd
var handle=array[],hwnd,ret,i=0


然后开启线程的时候
    arraysp.add(handle,"")
    handle[i]=thread.beginthread("xxd.Upgrade","")
    i=i+1

开了大概3-4个线程,线程都有循环等待的语句的,然后关闭的时候
        var len
        arraysp.size(handle,len)
        for(i=0;i<len;i++)
            thread.closehandle(handle[i])
        endfor
        ret=ts.UnBindWindow()

当结束的时候会提示内存不能为read,请问是什么原因?

作者: tobydu    时间: 2014-4-11 15:39
本帖最后由 tobydu 于 2014-4-11 17:13 编辑

高手,大神帮忙看看为什么。
作者: 157245227    时间: 2014-4-12 15:20
http://bbs.tyuyan.com/thread-14000-1-1.html你看下这个帖子
作者: q273814    时间: 2014-4-13 04:23
当多个线程同时试图更改同一个全局变量的值的时候会发生 这种情况
建议去了解下多线程和临界区的概念 可以看一下关于临界区的教程

      当编写在线程执行时运行的代码时,必须考虑到其他线程可能同时也在执行.在某些特殊情况下,必须避免两个线程同时使用同一个全局对象或者变量

       临界区像一扇门,用于阻止其他线程进入一段代码中. 与其他的同步对象不同,临界区不等于等待函数,只能用于单一进程中的线程.一个临界区在同一时间内只允许一个线程访问受保护的内存或者资源.临界区可以用于同步访问非线程安全的代码
作者: tobydu    时间: 2014-4-14 09:02
157245227 发表于 2014-4-12 15:20
http://bbs.tyuyan.com/thread-14000-1-1.html你看下这个帖子

非常感谢!
作者: 画面    时间: 2014-8-13 12:20
q273814 发表于 2014-4-13 04:23
当多个线程同时试图更改同一个全局变量的值的时候会发生 这种情况
建议去了解下多线程和临界区的概念 可以 ...

当编写在线程执行时运行的代码时,必须考虑到其他线程可能同时也在执行.在某些特殊情况下,必须避免两个线程同时使用同一个全局对象或者变量

大神,请问下,如果2个线程同时去更改同一个全局变量会报内存错。但是如果他们同时访问一个全局变量,但是不改变这个全局变量,是不是不会报错?
作者: q273814    时间: 2014-8-14 08:06
画面 发表于 2014-8-13 12:20
当编写在线程执行时运行的代码时,必须考虑到其他线程可能同时也在执行.在某些特殊情况下,必须避免两个线 ...

对的 可以同时读取 不能同时更改 就好像你家人给你起名字 只能取一个 但是可以同时叫你的名字
作者: 画面    时间: 2014-8-14 11:30
q273814 发表于 2014-8-14 08:06
对的 可以同时读取 不能同时更改 就好像你家人给你起名字 只能取一个 但是可以同时叫你的名字 ...

非常感谢




欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/) Powered by Discuz! X3.1