b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

简易语言的多线程机制初步研究

电脑杂谈  发布时间:2020-05-09 08:16:19  来源:网络整理

如何用c语言创建线程_易语言线程安全调用_c语言 多线程 线程锁

Easy Language 1.的多线程机制的初步探索. 关于多线程的冲突. 进程是一个独立的应用程序,线程是进程的代码片段. 非经验丰富的程序员不应接触多线程,以免造成混淆. 从3.6版开始,已添加了多线程支持库,以提供对多线程的支持,并通过实现进入许可机制来避免多线程冲突. 多线程是一种允许在程序中同时执行多个指令流的机制. 每个指令流都称为线程,并且彼此独立. 线程也称为轻量级进程. 它具有像进程一样的独立执行控制,并由操作系统调度. 区别在于线程没有独立的存储空间,而是与进程中的其他线程共享存储空间,这使得线程之间的通信比进程简单得多. 多个线程的执行是并发的,也就是说,在逻辑上是“同时的”,而不管它在物理上是“同时的”. 如果系统只有一个CPU,则不可能实现真正的“同时”,但是由于CPU的速度非常快,用户不会感觉到差异,因此我们不需要关心它,我们只需要假设每个线程同时执行. 多线程与传统单线程之间在程序设计上的最大区别在于易语言线程安全调用,由于每个线程的控制流彼此独立,因此每个线程之间的代码无法按顺序执行,从而导致诸如线程调度之类的问题. 和同步. 将在下面讨论. 由于同一进程的多个线程共享同一块存储空间,在带来便利的同时,还带来了访问冲突的严重问题.

如何用c语言创建线程_c语言 多线程 线程锁_易语言线程安全调用

多线程也有其缺点. 每当应用程序使用多个线程时,如果多个线程尝试同时使用相同的数据或资源,则可能会造成麻烦. 一旦发生这种情况,程序将变得非常复杂且难以调试. 更糟糕的是,多线程代码在初始开发期间通常运行良好,但在形成产品时经常失败,因为多个未检测到的线程与同一数据或资源进行交互. 这使得多线程编程非常危险. 因此,在编程时,您需要考虑多个线程访问同一资源时发生冲突的问题: 当一个线程在访问过程对象时,另一个线程想要更​​改该对象,这可能会产生错误的结果. 因此,程序员在编程时应解决此冲突. 避免线程冲突的最简单方法是使线程永远不会与相同的数据或资源进行交互. 但这不一定可行. 对于任何多线程程序,避免或最小化共享数据或资源应该是一个目标. 其次,下面介绍使用基于Win32的API函数进行多线程编程的过程. 1.使用Win32函数创建和终止线程. Win32函数库提供了多线程控制操作功能,包括创建线程,终止线程和建立互斥区域. 首先,在应用程序主线程或其他活动线程中的适当位置创建一个新线程. 创建线程的函数如下: HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);其中参数lpThreadAttributes指定线程的安全属性;在Windows 95中指定了dwSize. lpStartAddress的堆栈深度指定线程的起始地址. 一般情况是以下原型函数: DWORD WINAPI ThreadFunc(LPVOID); lpParameter指定执行线程时传递给线程的32位参数,即上述函数的参数; dwCreationFlags指定线程创建功能; lpThreadId指向可以返回线程ID值的DWORD变量.

c语言 多线程 线程锁_如何用c语言创建线程_易语言线程安全调用

如果创建成功,则返回线程的句柄,否则返回NULL. 创建新线程后,该线程开始执行. 如果在dwCreationFlags中使用了CREATE_SUSPENDED功能,则该线程将不会立即执行,而是会先被挂起,并在调用ResumeThread之后启动该线程. 在此过程中,可以调用该函数: BOOL SetThreadPriority(HANDLE hThread,int nPriority);设置线程的优先级. 当线程的函数返回时,线程将自动终止. 如果程执行期间中止,则可以调用该函数: VOID ExitThread(DWORD dwExitCode);如果线程程外终止,则可以调用以下函数: BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);但应注意: 此功能可能会导致系统不稳定,并且不会释放线程占用的资源. 因此,通常情况下,建议不要使用此功能. 如果要终止的线程是进程中的最后一个线程,则在终止线程之后,也应终止相应的进程. 2.使用Win32函数控制线程对线程主体中共享资源的访问. 如果该线程是完全独立的,并且在数据访问和其他资源操作中不与其他线程冲突,则可以按照通常的单线程方法进行编程.

c语言 多线程 线程锁_易语言线程安全调用_如何用c语言创建线程

但是,多线程处理通常不是这种情况,并且某些资源通常程之间同时访问. 例如,一个线程负责公式计算,另一线程负责结果显示,并且两个线程必须访问相同的结果变量. 如果此时未执行冲突控制,则可能会显示错误的结果. 由共享资源的访问引起的冲突是不可避免的,但是我们可以使用以下方法来控制操作: (1)通过设置线程的互斥对象,可以在发生冲突的地方进行同步控制. 首先,创建互斥对象并获取句柄: HANDLE CreateMutex();然后,程可能发生冲突的区域的开始处(即在访问共享资源之前),调用WaitForSingleObject将句柄传递给函数并请求占用互斥对象: dwWaitResult = WaitForSingleObject(hMutex,5000L );访问共享资源后,释放互斥对象的占用: ReleaseMutex(hMutex);互斥对象只能一次被一个线程占用. 当互斥对象被一个线程占用时,如果另一个线程要占用它,则它必须等待,直到前一个线程被释放为止. (2)设置信号: 在操作共享资源之前打开信号;完成操作后关闭信号. 这类似于互斥对象的处理. 首先易语言线程安全调用,创建一个信号对象: HANDLE CreateSemaphore();或打开一个信号对象: HANDLE OpenSemaphore();然后,程访问共享资源之前,调用WaitForSingleObject.

访问共享资源后,释放信号对象的占用: ReleaseSemaphore();信号对象允许同时访问多个线程的共享资源,并指定创建对象时可以同时访问的最大线程数. 当线程成功访问应用程序时,信号对象中的计数器减一;调用ReleaseSemaphore函数后,信号对象中的计数器加1. 其中,计数器值大于或等于0,小于或等于创建时指定的最大值. 使用信号对象,我们不仅可以控制对共享资源的访问,还可以在应用程序初始化期间使用它们. 假设应用程序在创建信号对象时将其计数器的初始值设置为0,这会阻塞其他线程并保护资源. 初始化完成后,调用ReleaseSemaphore函数以将其计数器增加到用于正常访问和访问的最大值. 3.下面以简单的语言描述了多线程编程方法. 通过研究Yi语言附带的两个多线程例程,总结如下: (1)首先看一下Yi语言自己的多遍机制的解释: 1.创建进入许可: 创建并返回进入许可许可证值,用于在程序中输入指定的权限代码区域,以避免多线程冲突. 2.删除进入许可: 删除由“创建进入许可”命令创建的进入许可,以释放系统资源. 3.启动线程: 创建并启动一个线程,可重复使用以创建多个线程.

4. 输入许可区域: 根据创建的许可证输入指定的许可代码区域. 在此线程退出之前,如果其他线程想要通过相同的进入许可进入许可代码区域,则它们必须首先等待该线程退出许可代码区域,从而确保只有一个线程可以进入并执行指定的许可代码区域. 随时. 我的理解: ①执行许可证区域中的代码时,不允许调用其他程序,从而确保了多线程的安全性. ②即使使用相同的许可证值进入许可区域,也必须等待首先输入的程序完成才能运行. ③多线程的目的是允许程序同时运行,但是“允许区域”可能会限制分支的操作​​. 为什么?由于多线程可能会导致程序混乱,因此“许可区域”可确保程序执行的安全性. 5.退出许可区域: 指示当前线程退出许可代码区域,并允许使用相同进入许可的其他线程进入许可代码区域. (2)Easy Language的多线程编程过程大致如下: 1.使用“创建条目许可证”命令为进入指定许可证代码区域的线程建立许可证. 2.使用“启动线程”命令创建并启动线程以运行线程的子例程. 3.程子例程中使用“输入权限区域”使该线程占据一个权限代码区域,并锁定该代码区域以防止其他线程进入,并锁定其他线程运行以避免线程冲突. 4.使用“退出许可证区域”解锁许可证代码区域,以允许其他线程进入.

如果要同时运行多个线程,可以为每个线程创建一个进入许可,然后将进入许可区域和退出许可区域连接起来,以使多个线程同时运行. 5.退出程序时,删除进入许可证以释放系统资源. (3)下面的示例代码同时运行两个线程,一个是连续绘制圆,另一个是连续绘制矩形: 窗口汇编: 窗口汇编1汇编变量: 入口许可证1数据类型: 整数程序设置变量: 画圆判断数据类型: 逻辑类型装配变量: 画矩形判断数据类型: 逻辑类型装配变量: 进入许可证2数据类型: 整数类型════════════子程序: 单击_Button 1_※备注: 如果Button 1的标题为“ Stop drawing circle”,则开始绘制圆(绘制圆判断= False),否则,返回按钮1为“开始画圈”,将停止画圈(画圈判断=真). 画圆判断=反转(画圆判断)判断(画圆判断=真)如果(输入许可证1≠0)是(如果启动((画线))=真)按钮1. 标题=“停止绘制圆“如果为true,否则显示消息框(“无法创建进入许可证”,0,)如果默认按钮已结束1.标题=“开始绘制圆”判断结束══════════ ═══════════════子程序: 圆画线判断循环头(圆画判断=真)播种随机数()画板1.画笔颜色=取色值(采用随机数)(0,255),采用随机数(0,255),采用随机数(0,255))画板1.画笔颜色=采用颜色值(采用随机数(0,255),随机数字(0,255),取一个随机数(0,255))画板1.画一个椭圆(取一个随机数(1,画板1.宽度),取一个随机数(1,画板1.高度),取一个随机数(1,ar tboard 1.宽度),取一个随机数(1,画板1.高度))进入许可区域(进入许可1)离开许可区域(进入许可1)延迟(500)判断循环结束()==══ ══════════════════════════子程序: __开始窗口_创建的进入许可证1 =创建进入许可证()进入许可证证书2 =创建进入许可() ═══════════════════════════════子程序: __启动窗口_将被删除删除进入许可(进入许可1)删除进入许可(进入许可2)═══════════════════════════════子程序: _button 2_单击以绘制矩形判断=反向(绘制矩形判断)判断(绘制矩形判断= true)如果(输入许可证2≠0)如果为true(开始线程(&绘制矩形线程)= True)按钮2. 标题=“停止矩形”如果为true,否则消息框(“失败”创建入口许可证”,0,)如果“默认结束”按钮2,则标题=“开始矩形”判断结束════子程序: 绘制矩形线程以判断第一个循环(绘制矩形判断= true)设置随机数()画板2. 画笔颜色=取颜色值(取随机数(0,255),取随机数( 0,255),采用随机数(0,255))画板2. 笔颜色=采用颜色值(采用随机数(0,255),采用随机数(0,255),采用随机数(0,255) )画板2.绘制矩形(取随机数(1,artboard 2.宽度),取随机数(1,artboard 2.高度),取随机数(1,artboard 2.宽度),取随机数(1,画板2. 高度))进入许可区域(进入许可2)退出许可区域(进入许可2)延迟(500)判断循环结束()本文来自Monkey Island游戏论坛:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-203920-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...