Micro Focus COBOL multi-thread solution

COBOL语言的网络编程 在Micro Focus COBOL中,我们需要定义SOAP或RESTful API接口,以下是创建RESTful API的基本代码结构。 阅读详情


There are 4 solution to support multi-thread program; it's depend on customer's requirement which one can be used properly.(Details from MF document)


To launch a multi-thread program, please use 'cobrun_t' instead of 'cobrun'.

Three Kinds of Storage

  • Working-Storage SectionData item in Working-Storage Section are global shared, among all threads.
  • Local-Storage SectionLocal-Storage Section works as function local variable;  for every recursion of the program a new instance of this data is allocated on the stack.
  • Thread-Local-Storage SectionThread-Local-Storage Section, Thread-local data can be viewed as a thread-specific Working-Storage data item.

Solution 1: Using Compiler Directive SERIAL

Compile your COBOL programs with the SERIAL directive.

SERIAL causes the COBOL run-time system to serialize access to your COBOL code between different threads. Only one thread can access your program at a time. This is the safest option, although it has potentially the highest overhead for execution speed. It is suitable when the COBOL program is providing access to a shared resource (for example, a printer), or when the COBOL program called from Java is in turn calling other COBOL programs which have not been enabled for multi-threading. 


For example:

MAINPROG will create 2 threads SUBPROG, and each thread will call a SUBSLEEP. Since SUBSLEEP will be called at the same time by two threads SUBPROG.


  • If SERIAL compiler directive is set when compile SUBSLEEP program
$ make
cob -ug MAINPROG.cbl -C "list(MAINPROG.lst)" -C XREF -C SETTINGS
cob -ug SUBPROG.cbl -C "list(SUBPROG.lst)" -C XREF -C SETTINGS
cob -ug SUBSLEEP.cbl -C "list(SUBSLEEP.lst)" -C XREF -C SETTINGS -C SERIAL

$ cobrun_t MAINPROG
SUBSLEEP ENTRY, WSS-VAR=00
SUBSLEEP EXIT,  WSS-VAR=01
SUBSLEEP ENTRY, WSS-VAR=01
SUBSLEEP EXIT,  WSS-VAR=02

We can find that only one SUBSLEEP can be run at a time. The second will not come in until the first has quit.


  • If NO SERIAL compiler directive is set when compile SUBSLEEP program
$ make
cob -ug MAINPROG.cbl -C "list(MAINPROG.lst)" -C XREF -C SETTINGS
cob -ug SUBPROG.cbl -C "list(SUBPROG.lst)" -C XREF -C SETTINGS
cob -ug SUBSLEEP.cbl -C "list(SUBSLEEP.lst)" -C XREF -C SETTINGS

$ cobrun_t MAINPROG
SUBSLEEP ENTRY, WSS-VAR=00
SUBSLEEP ENTRY, WSS-VAR=01
SUBSLEEP EXIT,  WSS-VAR=02
SUBSLEEP EXIT,  WSS-VAR=02

We can find both SUBSLEEP can be entry at the same time.


Notice: The WSS is global, the setting on first coming will affect the later value.


Solution 2: Making per-thread Working-Storage Section

Compile your COBOL programs with the REENTRANT"2" directive.

REENTRANT"2" causes the COBOL run-time system to allocate separate user data and FD file areas to each different thread. This prevents any conflicts or data corruption within the program. But REENTRANT"2" can't guarantee thread-safety if it calls other non-threaded programs, or accesses other shared resources - in these sorts of cases, SERIAL is a safer option. The REENTRANT"2" directive can provide better performance than SERIAL as one thread is not kept waiting for the next thread to finish.

(REENTRANT"1" is default setting)


In other words, REENTRANT"2" make WSS per-thread, so there is no shared data between different threads.

$ make
cob -ug MAINPROG.cbl -C "list(MAINPROG.lst)" -C XREF -C SETTINGS
cob -ug SUBPROG.cbl -C "list(SUBPROG.lst)" -C XREF -C SETTINGS
cob -ug SUBSLEEP.cbl -C "list(SUBSLEEP.lst)" -C XREF -C SETTINGS -C REENTRANT=2

$ cobrun_t MAINPROG
SUBSLEEP ENTRY, WSS-VAR=00
SUBSLEEP ENTRY, WSS-VAR=00
SUBSLEEP EXIT,  WSS-VAR=01
SUBSLEEP EXIT,  WSS-VAR=02


Solution 3: Using Thread-Local-Storage Section

Use thread-local storage in your COBOL programs instead of working storage.

Thread-local storage is allocated per thread, so there is no possibility of one thread corrupting the data used by another thread. This is fairly efficient, but might not always be an option with legacy code.


In fact, Solution 2 is trying to make Working-Storage Section work as Thread-Local-Storage Section.


Solution 4: Using Synchronized Operation


Multi-thread your COBOL program using COBOL multi-threading syntax or run-time system calls.

This can be very efficient as you control which data is thread-local and which data is shared between threads. You could use this option in COBOL driver programs that sit between the Java run-time environment and your legacy COBOL programs. Your driver program would be responsible for controlling access to the legacy programs, and would need to use semaphores or some similar mechanism to prevent two threads from accessing the same code at the same time.


You can use MUTEX to access variable exclusively.

With this solution, Working-Storage Section are not allocated pre-thread, they are shared, so it's depend on synchronized strategy to make variable access exclusively when necessary.


Appendix: Program Sources

MAINPROG.cbl

       PROGRAM-ID. "MAINPROG". 
       ENVIRONMENT DIVISION. 

       WORKING-STORAGE SECTION. 
       78 THREAD-COUNT VALUE 2.
       01 I1    PIC 9(2) COMP-5.

       01 THREAD-ENTRY     USAGE PROCEDURE-POINTER.
       01 THREAD-RETURN    USAGE POINTER.

       01 SHARED-STORAGE OCCURS THREAD-COUNT TIMES.
          03 THREAD-ID          PIC 9(2) COMP-5.
          03 THREAD-DATA        PIC X(10).
          03 THREAD-HANDLE      USAGE POINTER.

       PROCEDURE DIVISION. 
*     *    DISPLAY "MAINPROG: ENTRY".
           SET THREAD-ENTRY    TO ENTRY "SUBPROG"

           PERFORM VARYING I1 FROM 1 BY 1 UNTIL I1 > THREAD-COUNT
               MOVE I1 TO THREAD-ID(I1)
               MOVE I1 TO THREAD-DATA(I1)

               CALL "CBL_THREAD_CREATE_P" USING
                    BY VALUE THREAD-ENTRY
                    BY REFERENCE SHARED-STORAGE(I1)
                    BY VALUE     0
*     *             BY VALUE     LENGTH OF SHARED-STORAGE(I1)
                    BY VALUE     1 
                    BY VALUE     0 
                    BY VALUE     0 
                    BY REFERENCE THREAD-HANDLE(I1)
               IF RETURN-CODE NOT = 0 
                   DISPLAY "FAIL: CANNOT CREATE THREAD" 
                   STOP RUN 
               END-IF 
           END-PERFORM 


           PERFORM VARYING I1 FROM 1 BY 1 UNTIL I1 > THREAD-COUNT
                CALL 'CBL_THREAD_WAIT'  USING
                                        BY VALUE THREAD-HANDLE(I1)
                                        BY REFERENCE THREAD-RETURN
           END-PERFORM.

      *    DISPLAY "MAINPROG EXIT".
           STOP RUN. 

       END PROGRAM "MAINPROG". 



SUBPROG.cbl

       PROGRAM-ID. "SUBPROG". 
       WORKING-STORAGE SECTION. 
       01 SLEEP-PARM.
          03 CALLER     PIC X(10).
          03 SECOND     PIC 9(2) COMP-5.
          03 TID        PIC 9(2) COMP-5.

       LOCAL-STORAGE SECTION.

       LINKAGE SECTION. 
       01 THREAD-PARM.
          03 THREAD-ID          PIC 9(2) COMP-5.
          03 THREAD-DATA        PIC X(10).
          03 THREAD-HANDLE      USAGE POINTER.

       PROCEDURE DIVISION USING THREAD-PARM. 
      *    DISPLAY "SUBPROG ENTRY".

           MOVE "SUBPROG" TO CALLER.
           MOVE 2 TO SECOND.
           MOVE THREAD-ID TO TID.
           CALL "SUBSLEEP" USING SLEEP-PARM.

      *    DISPLAY "SUBPROG EXIT".
           EXIT PROGRAM. 
       END PROGRAM "SUBPROG"



SUBSLEEP.cbl

       PROGRAM-ID. "SUBSLEEP". 
       WORKING-STORAGE SECTION. 
       01  WSS-VAR      PIC 9(02) VALUES 0.

       LOCAL-STORAGE SECTION.
       01 SLEEPTIME                 PIC 9(8).

       01 TIME-TODAY-1              PIC 9(8) VALUE 0.
       01 TIME-TODAY-2              PIC 9(8) VALUE 0.
       01 DELTATIME                 PIC 9(8) VALUE 0.

       LINKAGE SECTION. 
       01 SLEEP-PARM.
          03 CALLER     PIC X(10).
          03 SECOND     PIC 9(02) COMP-5.
          03 TID        PIC 9(2) COMP-5.

       PROCEDURE DIVISION USING SLEEP-PARM. 
       THREAD-SECTION. 
           DISPLAY "SUBSLEEP ENTRY, WSS-VAR=" WSS-VAR.
           MOVE TID TO WSS-VAR.

           MULTIPLY 100 BY SECOND GIVING SLEEPTIME.
           ACCEPT TIME-TODAY-1 FROM TIME.
           PERFORM UNTIL DELTATIME >= SLEEPTIME
            ACCEPT TIME-TODAY-2 FROM TIME
            COMPUTE DELTATIME = (TIME-TODAY-2 - TIME-TODAY-1)
           END-PERFORM.

           DISPLAY "SUBSLEEP EXIT,  WSS-VAR=" WSS-VAR.
 
           EXIT PROGRAM. 
       END PROGRAM "SUBSLEEP".


COBOL Linkage Section Brief introduction of variables defined in Linkage Section Linkage Section Variable Limitations Only 01 and 77 level variable is defined in Linkage-Section.All 01 and 77 level variable are allocat 阅读详情

相关推荐

Micro Focus mfsort command

Here describe the micro focus utility 'mfsort' usage, and give some samples: Command Options Usage: mfsort . . .

程序员码工的专栏 1682

8.COBOL语言常用开发工具——《跟老吕学COBOL》

Eclipse COBOL插件允许你自定义各种配置选项,以满足你的特定需求。例如,你可以配置代码格式化规则、语法高亮颜色等。这些配置选项可以通过Eclipse的“Preferences”对话框进行访问。COBOL作为一种历史悠久的编程语言,在企业和银行等领域仍然有着广泛的应用。为了更好地支持COBOL开发,开发人员需要选择合适的开发工具、遵循最佳实践并利用各种资源来提高开发效率和质量。

Python老吕的博客 2062

富士通COBOL 编译器Windows版本

富士通COBOL 编译器Windows版本 It works under Windows 95, 98 and NT. Unlike its commercial version, this version has the ODBC connectivity and optimizations disabled. The compiler is compliant with the "Full ANSI Standard X3.23 1985, ISO- 1989- 1985". It is compatible with OS/VS COBOL, VS COBOL II and Micro Focus. There is an embedded SQL Preprocessor, an embedded COBOL Report Writer, a full function COBOL GUI Source Code Debugger, an IDE , Micro Focus Conversion Utility and a file utility.

Micro Focus COBOL multi-thread programming

This is samples of Micro Focus support multi-thread programming. Step 1: Check multi-thread run-time system CBL_THREAD_SELF API can be used to check whether multi-thread run-time ?

程序员码工的专栏 852

1panel面板实战:Docker容器存储路径迁移与优化指南

本文详细介绍了在1panel面板中迁移Docker容器存储路径的完整流程与优化方法。针对系统盘空间不足的常见问题,通过停服务、搬数据、改配置三个核心步骤,指导用户安全地将Docker数据目录迁移至更大容量的独立分区,并提供了迁移后的深度管理技巧与常见避坑指南,帮助用户优化服务器存储资源。

ol789012的博客 865

【Unity】ABB CRB 15000 外部引导运动实战:从配置到实时控制

本文详细介绍了ABB CRB 15000协作机器人的外部引导运动(EGM)功能在Unity环境中的实战应用。从RobotStudio配置到Unity实时通信架构,再到EGM运动控制技巧和问题排查,全面解析如何实现机器人的高精度实时控制。通过实际案例展示EGM技术在精密装配等场景中的显著效果,帮助开发者快速掌握这一先进技术。

weixin_29057695的博客 445

给大家提供两个COBOL编译器(都是Micro Focus公司的)

一、 Net Express with .NET 5.1 Personal Edition   下载地址:http://download.youkuaiyun.com/source/3426389 (一共有 8 个部分,这仅是第一部分的下载地址,大家可以用 Micro Focus Net Express 5.1 关键字来找到所有的 8 个部分) Micro Focus 公司现在已经不提供下载了

MicroFocus的专栏 1万+

微波射频学习笔记18-------偶极子天线和微波天线设计介绍

几种天线设计方法的介绍 一、偶极子天线 1.天线模型 两根紧挨着的金属导体,长度均为四分之一波长,直径均远小于波长,两导体间距也远小于波长。 2.天线性能的设计因素 ① 单个导体长度L:(光速/频率)/4=四分之一波长(在空气中传播的波长),但在导体中传播,波长会变短; ② 导体半径R:远小于波长即可,使用导电率高些的材料,市面上常见直径零点几毫米就挺好,或者用波长/200,得出一个小200的值,也算远小于波长; ③ 两导体间距S:远小于波长即可,可以比半径更小点。 以上三个变量L、R、S,均可在仿真软件

Sil_sprout 1万+

cobol .cpy文件_Visual COBOL R3:“使传统的COBOL能够部署在JVM或.NET上”。

上周,Micro Focus启动了Visual COBOL R3 ,这是一个允许COBOL在JVM上运行的开发环境。 但是,公司在2011年将COBOL带入现代软件开发领域时又面临什么挑战,并且与COBOL相关吗? 在这次采访中,JAXenter与Micro Focus产品管理总监Mark Warren进行了交谈,以了解更多信息。 JAXenter:什么是Visual COBOL R3? ...

613

飞牛NAS挂载115网盘避坑指南:为什么你的大文件总是传输失败?

本文深入解析了在飞牛NAS上通过AList挂载115网盘时,大文件传输失败的深层原因,包括风控机制、网络协议及兼容性问题。文章提供了从基础排查到高阶优化的系统性解决方案,并建议采用Kopia分片备份等终极策略,以实现稳定可靠的云端数据流转。

weixin_29306011的博客 1688

STM32F103C8T6与OV7670摄像头在TFT屏上的实时数字识别系统实现

本文详细介绍了基于STM32F103C8T6单片机和OV7670摄像头实现实时数字识别系统的全过程。系统通过图像采集、预处理、二值化和模板匹配算法,在TFT屏上实时显示识别结果,并针对资源受限的单片机环境提供了内存与性能优化策略,适用于智能家居、工业仪表读数等低成本嵌入式视觉应用场景。

open4的博客 278

COBOL语言的软件开发工具

COBOL(Common Business-Oriented Language)是一种经典的编程语言,最早于1959年开发,特别适用于商业、金融和行政领域的应用程序开发。尽管其架构设计已有数十年,但COBOL依然在许多大型企业的信息系统中占有举足轻重的地位。随着技术的不断发展,各种COBOL开发工具应运而生,帮助程序员更高效地开发和维护COBOL代码。本文将探讨几种重要的COBOL语言开发工具及其在现代开发环境中的应用。

2501_90777201的博客 866

三相交错并联的boost变换器simulink仿真,电流双闭环控制策略

文章介绍了一种基于Simulink的三通道交错并联双向Buck-Boost变换器的设计与仿真。该变换器采用电压外环和三电流内环的控制策略,并通过120°载波移相技术实现Buck模式与Boost模式之间的平滑切换,有效避免了过压和过流问题。交错并联的拓扑结构不仅减少了电感电流的纹波,还缩小了每相电感的体积,提升了电路的响应速度,适用于储能系统。仿真过程完全离散化,采用离散解析器,主电路与控制部分以不同步长运行,更贴近实际应用。控制与采样环节均为手工搭建,未使用Matlab自带模块,展示了三相交错并联Boost

2510_91195931的博客 1706

micro focus cobol 文件大小限制

micro focus cobol 默认只能处理大小不超过2GB的文件,如果想要处理更大的文件,配置文件extfh.cfg里面应加入下面内容   [XFH-DEFAULT] FILEMAXSIZE=8 IDXFORMAT=8   FILEMAXSIZE={4|8}   4是指2GB以下,8指文件大小无限制。 IDXFORMAT={0|1|3|4|5|6|8}, 8指大容量ind...

ak47jp的专栏 365

47、利用组策略配置 Windows 防火墙与 IPsec 全解析

本文深入解析了如何利用组策略配置Windows防火墙与IPsec,涵盖防火墙规则基础、IPsec身份验证与加密机制、服务器和域隔离实现方法、WFAS中新旧IPsec规则的区别与配置流程,并详细说明了防火墙属性与规则的优先级计算方式。同时介绍了证书服务、EFS等未详述的安全功能及相关学习资源,帮助管理员通过组策略有效提升网络安全性。

onion的博客 101

为什么 CL_DEMO_OUTPUT 不能用于生产用途:不仅是 demo 标签那么简单

摘要:CL_DEMO_OUTPUT 虽能快速展示ABAP数据,但存在严重生产风险:1) 官方定位为示例工具,不承诺兼容性与支持;2) 非Released API,云环境直接不可用;3) 依赖SAP GUI,缺乏日志关键特性;4) 存在版本漂移、类型限制、性能隐患及安全缺口。典型事故案例包括后台Job崩溃、Gateway链路污染和云迁移失败。生产环境应改用结构化日志(如SLG1)或稳定API输出,避免将调试工具误作工程方案。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 131

COBOL GOBACK & STOP RUN & EXIT PROGRAM STATEMENT

There are 3 statements can be used to return from a program. 1. STOP RUN 2. GOBACK 3. EXIT PROGRAM STOP RUN Stop run statement will stop the current program and give control back to O

程序员码工的专栏 2889

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

COBOL Define Your Own File Handler

What's User Defined File Handler Customers can build some kind of their own file handler, inner the handler you can change default operation behavior. For example you can change “OUTPUT” mode to

程序员码工的专栏 1270

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

COBOL PERFORM verb

PERFORM paragraph vs. PERFORM paragraph1 THRU paragraph2 PERFORM paragraph Transfer control to paragraph, and transfer back when paragraph has finished to instruction immediately after the P

程序员码工的专栏 1267

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

COBOL call C function

Give a sample on how COBOL call C function. Including: 1. C function definition 2. parameter passing, char * pointer, int, null pointer 1. Define C function (myfun.c) void myfun(const uns

程序员码工的专栏 1237

COBOL GLOBAL & EXTERNAL Variable

GLOBAL Variable GLOBAL in an enclosing program makes that variable visible to a nested program with it. PROGRAM-ID.  Outer. WORKING-STORAGE SECTION. 01  Not-Global        PIC X. 01  Is-Global  

程序员码工的专栏 1093

COBOL parsing command-line options

Sample to parse command-line options Command line option syntax: "ab:c:" - a: a switch option - b/c: has a option value For example: PROG -a PROG -b b_value PROG -a -b b_value -c v_value.

程序员码工的专栏 1092

COBOL use timestamp

Display timestamp in COBOL. Program Sample: IDENTIFICATION DIVISION. PROGRAM-ID. TESTTIMESTAMP. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTI

程序员码工的专栏 1078
上一篇: Micro Focus COBOL multi-thread programming
下一篇: syncsort command on unix
假装80后
博客等级 码龄19年 28粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值