• 締切済み

スレッドのロックに関するアルゴリズム

今、プロセッサの並列処理に関する英文を読んでいるのですが、歯が立たなくて困っております。どなたか、知恵をお貸しください。 並列処理で発生する競合を検出するアルゴリズムの動作を示している箇所で、次の英文が出てきました。このアルゴリズムは、共通のロックを保持していない複数のスレッドが、共有サービス(メモリ?)にアクセスした場合に発生することのある競合をみつけるアルゴリズム、とのことです。 Set S(v) = S(v) intersection locks(th). If S(v) == NULL set, then raise an error. vは共有メモリ変数、C(v)は空でないロックのセット、locks(th)はすべてのロックを表すようです。 2つめの文章は、S(v)がNULLのときはエラーが発生、という意味だと思うのですが、1つめの文章の意味がよくわかりません。 intersectionとは論理積のことでしょうか? どなたか、知恵を貸してください!

みんなの回答

  • iriyak
  • ベストアンサー率48% (40/82)
回答No.2

こんにちは。 その英文の原本を参照できるようなサイトの紹介は可能でしょうか?? 文脈が落ちるとその語のみを見て訳出しても意味が通らない可能性があります。 回答者は、そのような場合に質問者の読解の助けにならない(場合によっては混乱させる)ことを心配しています。 また、原本の提供が可能であれば、有識者により、読解を促進させるための文献、参考書籍などの紹介を期待できるかもしれませんよ!

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

アルゴリズムが > Set S(v) = S(v) intersection locks(th). > If S(v) == NULL set, then raise an error. だけとは思えません。 C(v)はS(v)のつもりでしょうか。記述通りだとS(v)の定義が完結していませんし、この前でS(v)の定義をしているか、S(v)を初期化の上で上記処理をthについて反復するのではありませんか。 意図としては、S(v)は共有メモリ変数にアクセスするスレッドが保持すべきロックで、locks(th)はスレッドthが保持するロックだとすると、それが共通部分を持たない(NULL set)と競合の恐れありということだと思います。

関連するQ&A

  • バイナリc-kermitのロックファイルの探査方法

    redhat9を使用しています。以下URLから http://www.columbia.edu/kermit/ck80binaries.html 以下バイナリを取得しました cku211.linux-i386-rh9 ku211.linux-i386-rh9 実行後以下のにエラーになります ?SET SPEED has no effect without prior SET LINE C-Kermit 8.0.211, 10 Apr 2004, for Linux Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New York. Type ? or HELP for help. (/etc/) C-Kermit>set line /dev/ttyS0 Sorry, write access to UUCP lockfile directory denied. ************************* HINT (Use SET HINTS OFF to suppress future hints): Please read the installation instructions file, ckuins.txt, or the UNIX appendix of the manual, "Using C-Kermit" or visit http://www.columbia.edu/kermit/ckuins.html ************************* 以下のようにロックファイルを確認しました。 strings ./cku211.linux-i386-rh9 |grep locks /etc/locks/LCK.. blocksize Blocksize: %s そこで想定されるディレクトリのパーミッションの 確認を行ないました [root@localhost etc]# ls -l |grep locks drwxrwxrwx 2 root root 4096 8月 31 19:02 locks 何処に問題あるのでしょうか?

  • 並列接続時のスピーカー

    YAMAHAのS115Vを片側2本ずつで1セットならす場合は、 1台が8Ω500Wのスピーカーなので、並列で4Ω1000Wということで いいのでしょうか。 アンプの選定で確信が持てず質問させていただきました。 よろしくお願い致します。

  • 共有ロック・・・

    プログラム  VB データベース ACCESSを使っているんですが 次のようなエラーメッセージがでるんです、 ファイルの共有ロック数が制限を超えています。さらに 多段階のOLE DBの操作でエラーが発生しました。各OLE DBの状態の値をチェックしてください。作業は終了しませんでした。とでるんです。 Deleteのところでこのようなエラーがでるんです。何か解決方法はないですかね Set cn = New ADODB.Connection Set rs = New ADODB.Recordset ' 接続文字列を設定 cn.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=c:\****.mdb" ' コネクションをオープン cn.Open ' 選択クエリーを作成 strSQL = "Select * From 顧客 ORDER BY ID ASC" ' レコードセットをオープン rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic, 1

  • PHPをまたいだロックの管理

    現在、PHPとMySQLを使ってデータ管理のプログラムを構築しています。 その中で、複数のPHPをまたいで同じデータテーブルを使おうとしたときに デッドロックが起きないようロック用のテーブルを作り、 データテーブルを編集するときにテーブルロック判定をかけようとしているのですが、 エラーが出てしまい上手くいきません。 以下に現状のプログラムを置いておきます。 もしお手隙でしたら、どなたかアドバイスいただけますでしょうか。 どうぞよろしくお願いいたします。 (ここから) $conn = @mysql_connect(DB_HOST, DB_NAME, DB_PASS); if (!$conn || !mysql_select_db(DB_MASTER, $conn)){ echo "DBopenError:DBオープン時エラーが発生しました。<DB>"; } mysql_set_charset('utf8', $conn); mysql_query('SET AUTOCOMMIT = 0;', $conn); mysql_query('START TRANSACTION;', $conn); // テーブルのロック mysql_query('LOCK TABLES tbllock WRITE, tbldata WRITE, temp WRITE;', $conn); // ロックの判定 $lock = checkLock($conn, 'tbldata', $sessID); // テーブルのロックを解除 mysql_query('UNLOCK TABLES;', $conn); $cnt = 0; while ($lock === false) { if ($cnt > 10) break; sleep(1); $lock = checkLock($conn, 'tbldata', $sessID); $cnt++; } if($lock === false) die('タイムアウトしました。'); else{ /* データ編集処理 */ } if (mysql_errno($conn)) mysql_query('COMMIT;', $conn); else mysql_query('ROLLBACK;', $conn); mysql_close($conn); //------------------------------------------------------------------ // 編集ロックチェック //------------------------------------------------------------------ function checkLock($dbID, $selTable, $oldsid) { $sqlstr = sprintf("SELECT * FROM tbllock WHERE tblName = '%s' FOR UPDATE;", $selTable); $result = mysql_query($sqlstr, $conn); $num = mysql_numrows($result); $flg = false; if ($num > 0) { if(mysql_result($result, 0, 'enable') === '0' || strlen(mysql_result($result, 0, 'lockUser')) === 0) $flg = true; else { if(in_array(mysql_result($result, 0, 'lockUser'), $oldsid)) $flg = true; else { $lockedDate = strtotime('-5 minute'); if (strtotime(mysql_result($result, 0, 'lockedDate')) < $lockedDate) { $sqlstr = sprintf("UPDATE tbllock SET enable = '0' WHERE tblName = '%s';", $selTable); $result = mysql_query($sqlstr, $dbID); $flg = true; } } } } if ($flg === true) { $sqlstr = sprintf("UPDATE tbllock SET lockUser = '%s', lockedDate = NOW(), enable = '1' WHERE tblName = '%s';", session_id(), $selTable); $result = mysql_query($sqlstr, $dbID); return true; } else return false; } (ここまで)

    • 締切済み
    • PHP
  • 3Sと4S、どちらが良いですか

    家庭内の電源を冷蔵庫やIH等を除きDC(直流)化を進めています。理由は太陽光発電の固定価格買い取り期間終了に対応するためですが、まぁ理由は置いといてください。 進めるにあたり、蓄電にリチウムイオン電池18650(電圧4.2-3.7V)とその充放電制御にBMS(バッテリーマネジメントシステム)を使う予定ですがBMSには3S、4S、5S、6S等があります。この"S"はセルなのかセットなのか定かではありませんが、例えば3Sは3本の18650セルを直列につないだ物を更に並列につないでいきます。4Sなら4本の直列を更に並列につなぐと言う感じです。 家庭内の家電を調べると多くが最後は12Vで動きます。少数が5Vで動きます。例外はノートパソコンが19.6V、電動ドリル(持ってません)が14.4Vといった感じです。 本題に入ります。BMSを使って安定した12Vを作る場合、3Sと4Sどちらの方が効率が良いのか教えてください。Youtubeで幾つか関連する動画を見ました。英語で良く分かりませんでしたが、4Sの方が良いと言っているみたいです。18650は2.5Vを下回ると急速に電力低下を起こす事が理由です。ただ自分としては 1. 3Sと4Sで同じ本数(例えば24本)の18650を使うと考えれば電力量は同じなのでは 2. 放電制御をBMSに任せているから電力低下を余り気にしなくても良いのでは 3. 4Sの場合、満充電時は4.2V x 4本で16.8Vになるから、そのままでは電源として使えないのでダウンコンバータを使う。すると最低でも6%の効率低下になる のでは 以上の理由から3Sの方が良いと思っています。ただ3Sの場合は ・満充電時でも12.6Vだから1並列に対して4.2-4.0V=0.2Vの利用幅しかない と言う問題はあります。その機器が12Vを少しでも下回ると動かない機器の場合です。うちには、そうゆう機器はありませんでした。 仮に4Sの方が良いとした場合、どうせスイッチングレギュレータのダウンコンバータを使うのであれば、6Sの方が電池的にも利用可能範囲的にも良いと思いますが、いかがでしょうか。 前置き(DC化を進める)の部分に対する意見は不要でお願いします。3Sか4Sか、はたまた別の効率的なやり方を、ご教授願えれば、とても助かります。 よろしくお願いします。

  • 同一スレッドで、ロックをかけたいのですが...

     同一スレッド内でロックを使いたいのですが 通常、ロックは別スレッド間でしか利かないようです。

  • このスレッドはロックされています

    今一度教えてください microsoftEdgeです。 今月中旬から突然のことですが、ヤフーで特に問題ないようなwebを見ようとすると「このスレッドはロックされています]という表示がでることがたまにあります。そのときは画面は文字だけになります。 「ページに到達できません」という表示も出ます。数秒待つか更新マークをクリックすると見ようとした画面が出ます。 セキュリティの変更はしていません。 Edgeのバージョンは最新、無線ルーターのつなぎ直しもしました。 キャッシュのクリアもしました。 ずっと同じ使い方をしていて何も設定を変えたりしていません。 皆様に方法を教えていただき試しましたが改善しません。 すべてのwebではないですが、不特定のサイトでこのようなことになります。今までみたいに見たい画面にストレートにつながるようにならないとストレスが溜まってしまいます。 なぜストレートに表示されなくなったのでしょうか。なぜつまずくのでしょうか。

  • 屈折率を持った物質中では同時性は保たれるでしょうか?

    屈折率を持った物質中では同時性は保たれるでしょうか? 今、S系に対しx方向にvで等速運動するS'系があるとします。 S'系に屈折率nを持った物質があるとし、その物質の中心で光を発生させ、前後に同じ距離lだけ離れたところに受光器をセットしました。 S'系に立っている観測者にとって同時性は保たれる(同時に受光される)でしょうか?

  • SQLServer2005 デッドロックの解決方法

    デッドロックから抜け出せません。 原因が分からず困っています。 何かアドバイスをいただけないでしょうか? SQLServer2005でサービスパックは何も当ててません。 レコードが15万件ほどのテーブル1があります。 主キーは列A,B,C。 インデックスは主キーに対応したクラスタインデックスのみ。 他に列C,D,Eでも一意で、これを条件に更新を行います。 以下のUPDATE文が10個ほどの並列プロセスで流れている のですが、数百回に一度デッドロックが発生します。 条件のDとEの値は最低どちらかは異なり、確かに一意の レコードに対して更新をかけています。 UPDATE テーブル1 SET F = '1' WHERE C+D+E IN (SELECT TOP1 C+D+E FROM テーブル1 WHERE D = '値' AND E = '値' ORDER BY C) SQL Server Profilerでトレースしたところ、上記のUPDATE文 のみによって引き起こされているようです。 DeadLock Graphを見るとKEYではなくPAGEに対して更新ロック(U) を取り合う様が見れるのですが、ひどくぐちゃぐちゃです。 試しに条件文のSELECTのみWITH (ROWLOCK,UPDLOCK)でデバッグ してみたのですが、大量のPAGEロック(IU)と一つのKEYロック(U)が取得されます。 また、D,E,Cの順に一意の非クラスタ化インデックスを貼ると、すっきりするのですが PAGE(IU)とKEY(U)に2つずつロックされます。(どうして一つにならない?) そもそもUPDATE条件文の中のSELECT文は何ロックを取得するのでしょうか? 更新ロック(U)、それとも共有ロック(S)を取得してからの排他ロック(X)? よろしくお願いします。

  • C言語、最初からやり直すつもりが異変が?

    いつも大変お世話になり誠にありがとうございます。 標記の件。 C言語を最初からやり直すつもりがコンパイル時に 理解できないエラーが発生しました。 原因はなんでしょうか? 度々すいません。 ご回答の程宜しくお願い申し上げます。          記 1.コード #include <stdio.h> int main(void) { printf("ようこそC言語へ!\n"); return 0; } 2.コンパイル C:\MinGW>gcc text1.c -o text1 text1.c:1:1: error: stray '\377' in program text1.c:1:2: error: stray '\376' in program text1.c:1:3: error: stray '#' in program text1.c:1:4: warning: null character(s) ignored text1.c:1:6: warning: null character(s) ignored text1.c:1:5: error: unknown type name 'i' text1.c:1:8: warning: null character(s) ignored text1.c:1:9: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'c' text1.c:1:10: warning: null character(s) ignored text1.c:1:9: error: unknown type name 'c' text1.c:1:12: warning: null character(s) ignored text1.c:1:14: warning: null character(s) ignored text1.c:1:16: warning: null character(s) ignored text1.c:1:18: warning: null character(s) ignored text1.c:1:22: warning: null character(s) ignored text1.c:1:24: warning: null character(s) ignored text1.c:1:26: warning: null character(s) ignored text1.c:1:28: warning: null character(s) ignored text1.c:1:30: warning: null character(s) ignored text1.c:1:32: warning: null character(s) ignored text1.c:1:34: warning: null character(s) ignored text1.c:1:36: warning: null character(s) ignored text1.c:1:38: warning: null character(s) ignored text1.c:2:1: warning: null character(s) ignored ^ text1.c:3:1: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ text1.c:4:1: warning: null character(s) ignored { ^ text1.c:5:1: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:5:3: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:5:5: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:5:7: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:5:11: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:5:13: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:5:15: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:5:17: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:5:19: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:5:21: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:5:23: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:5:25: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:5:27: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:5:29: warning: null character(s) ignored p r i n t f ( " ・F0S0]0C 萱岳0text1.c:6:1: warning: null character(s) ignored ^ text1.c:7:1: warning: null character(s) ignored r e t u r n 0 ; ^ text1.c:7:3: warning: null character(s) ignored r e t u r n 0 ; ^ text1.c:8:1: warning: null character(s) ignored } ^ text1.c:9:1: warning: null character(s) ignored text1.c:9:11: warning: null character(s) ignored text1.c:9:13: warning: null character(s) ignored text1.c:9:15: warning: null character(s) ignored text1.c:9:17: warning: null character(s) ignored text1.c:9:19: warning: null character(s) ignored text1.c:9:21: warning: null character(s) ignored text1.c:9:23: warning: null character(s) ignored text1.c:9:24: warning: null character(s) preserved in literal text1.c:9:49: warning: null character(s) ignored text1.c:9:24: warning: unknown escape sequence: '\000' text1.c:9:51: warning: null character(s) ignored text1.c:9:53: warning: null character(s) ignored text1.c:10:1: warning: null character(s) ignored text1.c:11:1: warning: null character(s) ignored text1.c:12:1: warning: null character(s) ignored text1.c:13:1: warning: null character(s) ignored 全部は入力できませんでした。 誠に申し訳ありません。 ご回答の程宜しくお願い申し上げます。

専門家に質問してみよう