0

Clozure CL を使用してアプリを作成しています。アプリでは、いくつかのファイルを書き込む必要があるため、ファイルごとに読み書きロックを作成しました。

今、私はquit関数を書こうとしています。すべてのファイルの書き込みが完了したかどうかを確認して終了します。基本的には以下のように動作します。

  1. すべてのファイルの読み取り/書き込みロックを取得します
  2. CCLをやめる

Clozure CL ドキュメントを読みましたが、grab-write-lock のような関数が見つかりません。「grab-lock」、「with-read-lock」、「with-write-lock」しか見つかりません。'grab-lock' は read-write-lock では機能しません。他の 2 つは自動的にロックを解放します。では、すべてのファイルの読み取り/書き込みロックを取得して (解放せずに)、アプリを終了するにはどうすればよいでしょうか?

4

1 に答える 1

1

私は Clozure CL のロック メカニズムに精通しているわけではありませんが、いくつかのマクロ展開は、これを行うための少なくとも 1 つの方法を説明できると思います。

CL-USER> (pprint (macroexpand-1 '(with-write-lock (my-lock)
                                  do-something)))

(CCL::WITH-LOCK-CONTEXT
  (LET* ((#:G350 (MAKE-LOCK-ACQUISITION))
         (#:G351 MY-LOCK))
    (DECLARE (DYNAMIC-EXTENT #:G350))
    (UNWIND-PROTECT
        (PROGN
          (CCL::WRITE-LOCK-RWLOCK #:G351 #:G350)
          DO-SOMETHING)
      (WHEN (CCL::LOCK-ACQUISITION.STATUS #:G350)
        (CCL::UNLOCK-RWLOCK #:G351)))))

これ ( を使用するccl::with-lock-context/ccl::write-lock-rwlock) が自分のコードでこれを行う良い方法かどうかはわかりませんが、確かにそれを行う方法です。

于 2014-04-16T18:20:50.937 に答える