热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

tcl多线程,如c,很难用程序执行线程

如何解决《tcl多线程,如c,很难用程序执行线程》经验,为你挑选了1个好方法。

我曾经在C中工作,其中线程很容易用我选择的特定函数创建.

现在在tcl我不能使用线程来启动我想要的特定功能,我试过这个:

package require Thread

proc printme {aa} {
    puts "$aa"
}

set abc "dasdasdas"

set pool [tpool::create -maxworkers 4 ]
# The list of *scripts* to evaluate
set tasks {
    {puts "ThisisOK"}
    {puts $abc}
    {printme "1234"}
}

# Post the work items (scripts to run)
foreach task $tasks {
    lappend jobs [tpool::post $pool $task]
}

# Wait for all the jobs to finish
for {set running $jobs} {[llength $running]} {} {
    tpool::wait $pool $running running 
}

# Get the results; you might want a different way to print the results...
foreach task $tasks job $jobs {
    set jobResult [tpool::get $pool $job]
    puts "TASK: $task"
    puts "RESULT: $jobResult"
}

我总是得到:执行错误206:无效的命令名称"printme"无效命令名称"printme"执行"printme"1234""从"tpool :: get $ pool $ job"中调用

为什么?



1> schlenk..:

问题是,Tcl线程模型与C中使用的模型非常不同.Tcl的模型基本上是基于消息传递的"默认情况下无共享"模型.

因此,池中的每个线程都是一个独立的解释器,并且对procprintme一无所知.您需要使用所需的过程来初始化这些解释器.

请参阅该::tpool::create命令的文档,它可以选择提供-initcmd您可以定义的位置或package require所需的内容.

所以试试这个来初始化你的线程:

set pool [tpool::create -maxworkers -initcmd {
    proc printme {aa} {
        puts "$aa"
    }}]

https://www.tcl.tk/man/tcl/ThreadCmd/tpool.htm#M10

更详细地回答你的评论:

不,没有办法让Tcl线程像C线程一样工作,并且可以自由地共享对象和proc.这是一个基本的设计决策,允许Tcl拥有一个没有大量全局锁定的解释器(与CPython相比),因为大多数东西都是线程本地的并且使用线程本地存储.

但是有一些方法可以更容易地初始化和使用多个线程解释器.一个-initcmd参数::tpool::create允许您为池中的每个解释器运行初始化代码,而无需手动执行.如果您的所有代码都存在于一个包中,您只需添加一个package require并且您的解释器已正确初始化.

如果您确实希望在多个线程之间共享状态,则可以使用::tsv子命令.它允许您以明确的方式在线程之间共享数组和其他内容.但在引擎盖下它涉及您可能从C中知道的典型锁和互斥量来调解访问.

包中还有另一组命令thread,可以让您更容易进行初始化.这是ttrace命令,它允许您简单地trace在一个解释器中执行的操作,并在另一个解释器中自动重复它.它非常智能,只能将您真正使用的触发器共享/复制到目标,而不是预先加载所有内容.


推荐阅读
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 本文探讨了利用JavaScript实现集合的对称差集算法的方法。该算法旨在处理多个数组作为输入参数,同时保留每个数组中元素的原始顺序。算法不会移除单个数组内的重复元素,但会删除在不同数组之间出现的重复项。通过这种方式,能够有效地计算出多个数组的对称差集。 ... [详细]
  • STM32串口通信:完整指南
    众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 2022年7月20日:关键数据与市场动态分析
    2022年7月20日,本文对当日的关键数据和市场动态进行了深入分析。主要内容包括:1. 关键数据的解读与趋势分析;2. 市场动态的变化及其对投资策略的影响;3. 相关经济指标的评估。通过这些分析,帮助读者更好地理解当前市场环境,为决策提供参考。 ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 利用PHP循环高效处理多条帖子表单数据 ... [详细]
  • 在本文中,我们将详细介绍如何构建一个用于自动回复消息的XML类。当微信服务器接收到用户消息时,该类将生成相应的自动回复消息。以下是具体的代码实现:```phpclass We_Xml { // 代码内容}```通过这个类,开发者可以轻松地处理各种消息类型,并实现高效的自动回复功能。我们将深入探讨类的各个方法和属性,帮助读者更好地理解和应用这一技术。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 深入理解 Java 控制结构的全面指南 ... [详细]
author-avatar
书友31617792
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有