您好、欢迎来到现金彩票网!
当前位置:双赢彩票 > 非托管代码 >

C 非托管代码的线程安全问题

发布时间:2019-05-27 16:15 来源:未知 编辑:admin

  百度知道电脑/网络操作系统/系统故障Windows

  请教一下C#的线程安全问题。如草图的结构,在C#Winform应用程序中以外部函数调用设备厂商封装成DLL的API函数,每台设备要定时读取,为了预防其中一台设备掉线(API可能会较长时间停在...

  请教一下C#的线程安全问题。如草图的结构,在C# Winform应用程序中以外部函数调用设备厂商封装成DLL的API函数,每台设备要定时读取,为了预防其中一台设备掉线(API可能会较长时间停在那里等设备响应)影响其它设备的读取,所以打算为每个设备启动一个线程,线程中用Timer循环读取。一共可能会有六十几个线程。这样,每个线程都会引用API中的读取函数。多个线程可能会并发调用API,这种情况需要考虑线程安全吗?求解!

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  展开全部新手吗?先了解一下什么是线程安全,线程安全指的是多线程在调用同一资源时是否出现相互冲突。这里要注意的是,同一资源——这个资源可能是外部硬件,也可能是某个对象或其属性!所以对资源一词很多初学者不明白,资源是硬件吗?资源并非仅仅是硬件,也可能是程序中的某个变量。或者个大家共有或共用的资源。dll是什么?win32的dll是动态库连接,换句话来说是一段程序的因为经常使用,然后被封装成独立的单元,以供调用。它是开发资源的一种,不是线程中要用到或上文所指的资源。而且,这种调用指的程序调用——程序如何调用的?答案是复制dll的副本装入程序域中,它没有程序边界的概念,就是谁用谁拿走一份而已。换句话来说,其实无论多少个程序在调用dll,都是程序自己装dll拷个副本装到自己的程序域中,与其他程序根本没有任何的干扰!如果你这种程序调用也象资源一样,只供一个程序调用,那动态连接库的意义何在?就象你在开发过程中引用了system空间(其实多数时间是引用了system.dll,当然在其他的dll中也可能存在system空间),你的意思是说其他的不能再引用了?或者无法开辟两个IDE进入编程?或者是你开发的程序运行后,别的调用system.dll的不能再调用了吗?显然不是!你的多线程内调用了dll,代表你把dll载到程序域中,任何线程均可能调用了,所以dll并不是上文线程安全中的资源。而COM口却是,如果两个及以上的线程同时调用一个COM口时,就可能出现线程安全问题了,当然了,你的主线程(创建线程)中存在某个变量,而多个线程访问这个变量时,也会出现线程安全问题。问题在于,你线程实际上只是一个程序方法在执行,他有独立的执行空间,但执行主体中却访问了主线程的值,因为这个值并不在这个线程的空间中,多个线程模式下也会导致线程安全问题。如果你是一个线程处理一个COM口,至少在COM资源上不会存在线程安全问题,但如果你线程中处理COM口之后的数据要写回到某个变量(共享资源)时,可能会出现线程安全问题。你调用的dll中的一个方法,某实在你的线程中被调用中,换句话来说,某中的COM的一些值是线程内的值,并不影响线程安全。

  微软中MSDN中的所谓线程安全指的是某个类中的属性或值被多线程改变时,没有串行化,会导致线程安全问题,所以会出现不保证线程安全说明存在,但一些类的某个方法(这个方法可能是改变某个值),多线程调用时,会进行串行化,不会引发太大的问题。所以方法被封装时就会告诉是否涉及到更改某个值,是否影响线程安全。你若是线程中调用的dll,其实线程之间已没有共享资源了,所以不存在线程安全问题。

http://green-core.net/feituoguandaima/287.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有