問題タブ [grand-central-dispatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - pthreadはGCDに勝る利点を提供しますか?
最近GrandCentralDispatchを学んだので、マルチスレッドコードが(GCDを使用して)非常に直感的であることがわかりました。ロックが不要であるという事実(および内部でロックレスデータ構造を使用するという事実)、およびAPIが非常に単純であるという事実が気に入っています。
今、私はpthreadを学び始めており、その複雑さに少し圧倒されざるを得ません。スレッド結合、ミューテックス、条件変数-これらすべてはGCDでは必要ありませんが、pthreadでは多くのAPI呼び出しがあります。
pthreadはGCDに勝る利点を提供しますか?それはより効率的ですか?pthreadがGCDでは実行できないこと(カーネルレベルのソフトウェアを除く)を実行できる通常のユースケースはありますか?
クロスプラットフォームの互換性に関しては、私はあまり心配していません。結局のところ、libdispatchはオープンソースであり、Appleはクロージャの変更をGCCへのパッチとして置き換え、clangはクロージャをサポートしており、すでに(FreeBSDを除く)、Apple以外のGCDの実装がいくつか見られ始めています。私は主にAPIの使用に興味があります(特定の例は素晴らしいでしょう!)。
c - 並列コードを使用すると、コンピューターの速度が向上しないのはなぜですか?
したがって、この質問はばかげているように聞こえますが(はい、デュアルコアを使用しています)、2つの異なるライブラリ(Grand Central DispatchとOpenMP)を試しました。また、clock()を使用して、並行して、速度は同じです。(記録のために、彼らは両方とも独自の形式の並列を使用していました)。彼らは異なるスレッドで実行されていると報告していますが、おそらく同じコアで実行されていますか?確認する方法はありますか?(どちらのライブラリもC用ですが、下位層では不快です。)これは非常に奇妙です。何か案は?
c - グランドセントラルディスパッチのスレッド数とスレッド数
私はCとGrandCentralDispatchを使用して、いくつかの重い計算を並列化しています。GCDで使用されているスレッドの数を取得するにはどうすればよいですか?また、コードの一部が現在どのスレッドで実行されているかを知ることは可能ですか?基本的に、複数のストリームでsprng(並列乱数)を使用したいので、そのために使用するストリームID(したがって、使用されているスレッド)を知る必要があります。
windows - Grand Central Dispatch (`libdispatch`) が Windows で利用可能になる可能性はありますか?
私はマルチスレッドを検討していますが、GCD は、 and を使用して手動でソリューションを作成するよりもはるかに優れたオプションのようです。しかし、ほとんどの新しい POSIX 互換システムに取り組んでいるか、間もなく取り組むように見えますが、Windows についてはどうですか? Windows に移植される可能性はどのくらいですか? それを妨げている障壁は何ですか?pthread.h
pthreads-win32
libdispatch
libdispatch
結局のところ、そのポーテージを実行するにはどうすればよいでしょうか?
編集:議論を始めるために、私がすでに知っているいくつかのこと:
- Windows でコンパイルできるブロック互換のコンパイラが必要ですよね?PLBlocks はそれを処理しますか?
- LLVMブロックのランタイムを使用できますか?
pthread.h
移植性のために、ユーザー空間のすべての依存関係libdispatch
を APR 呼び出しに置き換えることはできませんか? または、代わりに…を使用しpthreads-win32
てください…</li>
編集 1: Windows では利用できない にlibdispatch
(何らかの形で) 依存しているため、これは完全に完全に不可能であると聞いています... これが本当かどうか知っている人はいますか?kqueue
applescript - GCD と AppleEvents / NSOperationQueue と AppleScript
私が理解しているように、GCD によって提供されるスレッドには実行ループがありますが、ソース/ポートはありません。現在、NSOperationQueue 内で AppleEvents を介して AppleScripts を呼び出すいくつかのメソッドを使用しています。また、次のスタックトレースでアプリがクラッシュすることがあります。
私の質問:
- NSInvocationOperation または NSBlockOperation 内での AppleScript の使用
- GCD-Threads 内での AppleEvents の使用
- AppleEvents を使用する前に、gcd スレッドの実行ループにソース/ポートを追加する必要がありますか?
- [CATransaction commit] を使用する前に、gcd スレッドの実行ループにソース/ポートを追加する必要がありますか?
- [NSObject performSelectorAfterDelay...] を使用する前に、ソース/ポートを gcd スレッドの実行ループに追加する必要がありますか?
- はいの場合、どのように?
- 私は単純に CFRunLoopRunInMode(kCFRunLoopDefaultMode, 5.0, false); を呼び出すことができますか? /// または 30 または appleevent の定義されたタイムアウト?
cocoa - NSDictionary の keysOfEntriesPassingTest で必要なブロック オブジェクト/述語を指定するにはどうすればよいですか?
学習 (実用的ではありませんが、まだ) の目的で、NSDictionary で次のメソッドを使用して、定義したテストを使用して値を持つキーのセットを返したいと思います。残念ながら、述語を指定する方法がわかりません。
たとえば、私のすべての値が NSURL であり、ポート 8080 にあるすべての URL を取得したいとしましょう。これがコーディングの私の刺し傷です。正しい:
これは、次のコンパイラ エラーが返されるためです。
'void (^)(struct objc_object *, struct objc_object *, BOOL *)' を初期化する互換性のないブロック ポインター型、予期される 'BOOL (^)(struct objc_object *, struct objc_object *, BOOL *)'
私は何が欠けていますか?述語が想定されて
いる「ブロックオブジェクト」について詳しく説明しているドキュメントへのポインタをいただければ幸いです。
ありがとう!
そして、これは機能するコードです:
iphone - NSThread対NSOperationQueue対??? iPhoneで
現在NSThread
、別のスレッドで画像をキャッシュするために使用しています。
代わりに:
または、NSOperationQueue
から切り替える理由はありますNSThread
か?GCDはiPhone向けにリリースされたときの4番目のオプションですが、パフォーマンスが大幅に向上しない限り、ほとんどのプラットフォームで機能する方法を使い続けたいと思います。
@ Jon-Ericのアドバイスに基づいて、NSOperationQueue
/NSOperation
サブクラスソリューションを使用しました。それは非常にうまく機能します。このNSOperation
クラスは十分に柔軟性があるため、必要に応じて、呼び出し、ブロック、またはカスタムサブクラスで使用できます。どのように作成してNSOperation
も、実行する準備ができたら、操作キューに入れることができます。操作は、キューに入れるオブジェクトとして機能するように設計されているか、必要に応じてスタンドアロンの非同期メソッドとして実行できます。カスタム操作メソッドを同期して簡単に実行できるため、テストは非常に簡単です。
この質問をして以来、私はいくつかのプロジェクトでこれと同じ手法を使用してきましたが、コードとテストをクリーンで整理され、楽しく非同期に保つ方法に満足することはできませんでした。
A++++++++++再びサブクラス化されます
scope - Objective-C++でのGCD/ブロックスコープ
作業中のいくつかのC++テンプレートで、GCDを使用して計算を高速化しています。私はすでにいくつかの関数でそれを正常に実行しましたが、今はそれをメンバー関数で機能させようとしていますが、この奇妙なスコープの問題に遭遇しました。コードは次のようになります。
たとえば、a._c1m [ imodes2 + jmodes + k]のような配列要素にアクセスしているときにスコープの問題が発生する可能性があることを理解しています(つまり、そこにいくつかのポインタをスローする必要があるかもしれません)が、ここにあります実際の問題:たとえば、miやループインデックスjとkのようなNSIntegerを宣言すると、コンパイラは次のような大量のエラーを表示します。
'NSInteger op::mi'は'classop'の静的メンバーではありません
これは、このメンバー関数でのみ発生しました。フレンド関数にほぼ同じ手法を実装し(ブロックのスコープ内で同じNSInteger宣言を使用)、問題なく機能しました。
私が考えることができた唯一の修正は、ブロック外のすべてのループ変数をポインターとして宣言し、ブロックのスコープ内でそれらを逆参照することですが、これは一種のハックだと思います。誰かがここで何が起こっているのか知っていますか?
よろしくお願いします!
objective-c - dispatch_apply() から「抜け出す」方法は?
ブロックbreak
内のステートメントをシミュレートする方法はありますか?dispatch_apply()
たとえば、ブロックの列挙を扱っているすべての Cocoa API には、「停止」パラメーターがあります。
GCDに似たものはありますか?
macos - Linux でグランド セントラル ディスパッチを使用する
Apple がコードをオープンソース化しているので、これは可能ですか ( libdispatch
?) これをどのように利用できるかについて、私は少し混乱しています。これは、どのアプリケーションでも利用できる API を備えたライブラリのようなものですか、それとも Mac OS X に組み込まれた OS の機能ですか? Mac および iPhone (iOS 4) 用にビルドされたアプリケーションだけで、このライブラリを利用できますか?
gcc
Apple が導入した新しいセマンティックと互換性を持たせるには、ポートを実行する必要があると思います。