0

Windows で PHP を使用して pthreads を使用していますが、phalanger 3.0 で pthreads の実装をコンパイルして実行するにはどうすればよいですか? 現時点では、0 エラー / 0 警告でビルドされますが、実行すると次のように表示されます

CompileError: The class 'ThreadTest' is incomplete - its base class or interface is unknown in C:\phptests\thread.php on line 10, column 1.

Phalanger のインストール ディレクトリに、php 拡張子 .dll が含まれていることがわかります。ダウンロードした php_pthreads zip には、pthreads .dll 用の .pdb 中間ファイルが含まれています。Phalanger で pthreads をコンパイルして実行する方法はありますか?

4

1 に答える 1

1

Phalanger は pthread をサポートしていません。

clr_create_thread(callback [, parameters])関数または sbを介して .NET の代替を使用できます。C# で不足している pthread のサポートを実装する必要があります。

clr_create_threadただし、実際にはスレッドを作成しないため、少し誤解を招く名前です。代わりに、コールバックを受け取り、ThreadPoolで実行するようにスケジュールします。スレッド プールのスレッドは、コールバックが終了しても終了しないため、多少特殊です。代わりに、それらは後のリクエストで再利用されます (clr_create_threadコールバックの実行を再度呼び出すと、以前に使用したスレッドで終了する可能性があります)。そのため、スレッドは自発的に終了しないため、Joiningスレッドにはほとんど意味がありません。ThreadPoolただし、コールバックが終了するのを待ちたい場合は、他の .net 同期メカニズムを使用できます (AutoResetEventWaitHandle::WaitAll重要な部分です)。

use System\Threading;
class ThreadTest
{
    public static function main()
    {
        (new self)->run();
    }

    public function run()
    {
        $that = $this;

        $finished = [];

        for ($i = 0; $i < 5; $i++) {
            $finished[$i] = new Threading\AutoResetEvent(false);
            clr_create_thread(function() use ($that, $finished, $i) {
                $that->inathread();
                $finished[$i]->Set();
            });
        }

        Threading\WaitHandle::WaitAll($finished);
        echo "Main ended\n";
    }

    public function inathread()
    {
        $limit = rand(0, 15);
        $threadId = Threading\Thread::$CurrentThread->ManagedThreadId->ToString();
        echo "\n thread $threadId limit: " . $limit . " \n";
        for ($i = 0; $i < $limit; $i++) {
            echo "\n thread " . $threadId . " executing \n";
            Threading\Thread::Sleep(1000);
        }
        echo "\n thread $threadId ended \n";
    }
}
于 2014-03-30T10:22:30.180 に答える