I'm learning nim and porting some of my python code.

Here's a python program I'm trying to convert: 
    
    
    from threading import Thread, Lock
    import time
    
    lock=Lock()
    threadlist=[]
    data=0
    threadAdata=0
    threadBdata=0
    
    def threadA():
      global lock
      global data
      global threadAdata
      threadAdata = 0
      while threadAdata < 20 :
        lock.acquire()
        data+=1
        threadAdata+=1
        lock.release()
        time.sleep(.5)
    
    def threadB():
      global lock
      global data
      global threadBdata
      threadBdata = 0
      while threadBdata < 20 :
        lock.acquire()
        data+=1
        threadBdata+=1
        lock.release()
        time.sleep(0.25)
    
    t=Thread(target=threadA,args=())
    t.start()
    threadlist.append(t)
    
    t=Thread(target=threadB,args=())
    t.start()
    threadlist.append(t)
    
    for t in threadlist :
      t.join()
    
    print("data:",data)
    print("dataA:",threadAdata)
    print("dataB:",threadBdata)
    
    
    
    Run

This is my attempt at conversion so far. Doesn't compile - see comments. 
    
    
    import
      system, os, locks, tables, lists
    
    var
      lock : Lock
      data = 0
      threadAdata=0
      threadBdata=0
      threadslist : array[5,Thread] # this is wrong. it should NOT be fixed 
size. HAS to be runtime extensible. What is a better list/table?
    
    proc A() {.thread.} =
      threadAdata=0
      while threadAdata < 20 :
        acquire(L)
        data = data + 1
        threadAdata = threadAdata + 1
        release(L)
        sleep(500)
    
    proc B() {.thread.} =
      threadBdata=0
      while threadBdata < 20 :
        acquire(L)
        data = data + 1
        threadBdata = threadBdata + 1
        release(L)
        sleep(250)
    
    # is this procedure even necessary?
    proc AddThread(tp: proc (arg: TArg) {.thread, nimcall.}; param: TArg) : 
Thread =
    # this is meant to create the thread and return a Thread
      var
        r : Thread
      createThread(tp,r)
      result = r
    
    when isMainModule:
      initLock(lock)
      
      threadlist.append(AddThread(A))
      threadlist.append(AddThread(B))
      
      joinThreads(threadlist)
      
      echo "data = " & data  # should be 40
      echo "dataA = " & threadAdata # should be 20
      echo "dataB = " & threadBdata # should be 20
    
    
    Run

I'd like to keep the list of threads as I've got many threads to manage but the 
number of threads should be decided at runtime. This is just a simplified 
example to be clearer to understand. 

Reply via email to