同期では 1 つの CPU を複数タスク (スレッド) が共有しますが、この共有は、スレッドの切り替えに要する時間を最小化できるような方法で行われます。スレッド対応のサーバー上ではエージェントは交互にタスクを実行しますが、時間が節約されるので、あたかもタスクが同時に発生しているかのように見えます。
次のサンプルエージェント Comm1 では、類似したエージェント Comm2 と同時に動作します。この例では、エージェントを同時に実行する場合にどのようにコードにロックをかけるかを説明しています。
これらのエージェントは同時に起動し、「Update」という名のロックを掛けます。その後、以下の処理が行われます。
このプロセスは、For ループが続く限り繰り返されます。この例の場合では 5 回繰り返されます。
'Comm1:
Option Public
' Remove the following line if you do not have a
' resource library defined.
Use "ThreadsLib"
Sub Initialize
Dim lockName As String
Dim lockID As Integer, refcnt As Integer
Dim gotLock As Variant, releaseLock As Variant, _
deleteLock As Variant
On Error Goto syn_error
' Provide some unique name here to distinguish the agents.
ID = "Comm1 tuvwx:5706 "
Msgbox ID & "Started"
lockName = "Update"
On Error Goto syn_error
' Create the lock
lockID = Createlock(uName)
If (lockID <> -1) Then
Msgbox ID & "Created lock: " & lockID
End If
' Put agent to sleep for a second.
' This gives the second agent time to start.
Sleep 1
For x = 1 To 5
' Attempt to get the lock and report the outcome
' as well as the reference count
gotLock = CodeLock(lockID)
If (gotLock) Then
Msgbox ID & " Got lock: " & lockID & " - at: " & _
Now()
refcnt = Codelockcheck(lockID)
Msgbox ID & " Reference count is " & refcnt
' Do some meaningful work here, or just sleep
Sleep 1
Else
Msgbox ID & "Failed to get lock"
End If
' Release the lock so the other agent can get it.
releaseLock = Codeunlock(lockID)
If (releaseLock) Then
Msgbox ID & " Releasing lock: " & lockID & _
" - at: " & Now()
' Sleep here allows the other agents to obtain
' the lock before this agent has a chance to.
Sleep 1
Else
Msgbox ID & "Failed to release lock"
End If
Next
' When we are finished, destroy this agent's reference
' to the lock
deleteLock = Destroylock(lockID)
If (deleteLock ) Then
Msgbox ID & "Destroyed lock " & lockID
Else
Msgbox ID & "Failed to destroy lock"
End If
Msgbox ID & "Done "
Exit Sub
syn_error:
errormsg = " * * Error: " & Err & " - " & Error() & _
" in " & ID & " at " & Erl()
Msgbox errormsg
Resume Next
End Sub
次は出力結果の例です。Comm1 (ID tuvwx:5706) と Comm2 (ID uvwxy:5742) は Domino Web サーバーのエージェントとして同時に実行され、次のように出力します。
Addin: Agent message box: Comm1 tuvwx:5706 Started Addin: Agent message box: Comm1 tuvwx:5706 Created lock: 0 Addin: Agent message box: Comm2 uvwxy:5742 Started Addin: Agent message box: Comm2 uvwxy:5742 Created lock: 0 Addin: Agent message box: Comm1 tuvwx:5706 Got lock: 0 - at: 2/10/99 1:57:06 PM Addin: Agent message box: Comm1 tuvwx:5706 Reference count is 1 Addin: Agent message box: Comm2 uvwxy:5742 Got lock: 0 - at: 2/10/99 1:57:07 PM Addin: Agent message box: Comm2 uvwxy:5742 Reference count is 1 Addin: Agent message box: Comm1 tuvwx:5706 Releasing update_lock: 0 - at: 2/10/99 1:57:07 PM Addin: Agent message box: Comm2 uvwxy:5742 Releasing update_lock: 0 - at: 2/10/99 1:57:08 PM Addin: Agent message box: Comm1 tuvwx:5706 Got lock: 0 - at: 2/10/99 1:57:08 PM Addin: Agent message box: Comm1 tuvwx:5706 Reference count is 1 Addin: Agent message box: Comm2 uvwxy:5742 Got lock: 0 - at: 2/10/99 1:57:09 PM Addin: Agent message box: Comm2 uvwxy:5742 Reference count is 1 Addin: Agent message box: Comm1 tuvwx:5706 Releasing lock: 0 - at: 2/10/99 1:57:09 PM Addin: Agent message box: Comm2 uvwxy:5742 Releasing lock: 0 - at: 2/10/99 1:57:10 PM Addin: Agent message box: Comm1 tuvwx:5706 Got lock: 0 - at: 2/10/99 1:57:10 PM Addin: Agent message box: Comm1 tuvwx:5706 Reference count is 1 Addin: Agent message box: Comm2 uvwxy:5742 Got lock: 0 - at: 2/10/99 1:57:12 PM Addin: Agent message box: Comm2 uvwxy:5742 Reference count is 1 Addin: Agent message box: Comm1 tuvwx:5706 Releasing lock: 0 - at: 2/10/99 1:57:12 PM Addin: Agent message box: Comm2 uvwxy:5742 Releasing lock: 0 - at: 2/10/99 1:57:13 PM Addin: Agent message box: Comm1 tuvwx:5706 Got lock: 0 - at: 2/10/99 1:57:13 PM Addin: Agent message box: Comm1 tuvwx:5706 Reference count is 1 Addin: Agent message box: Comm2 uvwxy:5742 Got lock: 0 - at: 2/10/99 1:57:14 PM Addin: Agent message box: Comm2 uvwxy:5742 Reference count is 1 Addin: Agent message box: Comm1 tuvwx:5706 Releasing lock: 0 - at: 2/10/99 1:57:14 PM Addin: Agent message box: Comm2 uvwxy:5742 Releasing lock: 0 - at: 2/10/99 1:57:15 PM Addin: Agent message box: Comm1 tuvwx:5706 Got lock: 0 - at: 2/10/99 1:57:15 PM Addin: Agent message box: Comm1 tuvwx:5706 Reference count is 1 Addin: Agent message box: Comm2 uvwxy:5742 Got lock: 0 - at: 2/10/99 1:57:16 PM Addin: Agent message box: Comm2 uvwxy:5742 Reference count is 1 Addin: Agent message box: Comm1 tuvwx:5706 Releasing lock: 0 - at: 2/10/99 1:57:16 PM Addin: Agent message box: Comm2 uvwxy:5742 Releasing lock: 0 - at: 2/10/99 1:57:18 PM Addin: Agent message box: Comm1 tuvwx:5706 Destroyed lock 0 Addin: Agent message box: Comm1 tuvwx:5706 Done Addin: Agent message box: Comm2 uvwxy:5742 Destroyed lock 0 Addin: Agent message box: Comm2 uvwxy:5742 Done
これらの関数は、1 つのプロセス内の LotusScript® 協調エージェントのインスタンス間の通信だけに使用されます。これらは、非同期 Web エージェント用に特に設計されているものです。
サポートされるプラットフォームは、Win32、OS/2、UNIX (Solaris、HP-UX、AIX®)、NT Alpha です。