Phalanger は pthread をサポートしていません。
clr_create_thread(callback [, parameters])
関数または sbを介して .NET の代替を使用できます。C# で不足している pthread のサポートを実装する必要があります。
clr_create_thread
ただし、実際にはスレッドを作成しないため、少し誤解を招く名前です。代わりに、コールバックを受け取り、ThreadPoolで実行するようにスケジュールします。スレッド プールのスレッドは、コールバックが終了しても終了しないため、多少特殊です。代わりに、それらは後のリクエストで再利用されます (clr_create_thread
コールバックの実行を再度呼び出すと、以前に使用したスレッドで終了する可能性があります)。そのため、スレッドは自発的に終了しないため、Join
ingスレッドにはほとんど意味がありません。ThreadPool
ただし、コールバックが終了するのを待ちたい場合は、他の .net 同期メカニズムを使用できます (AutoResetEvent
がWaitHandle::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";
}
}