Phalanger 不支持 pthread。
您可以通过clr_create_thread(callback [, parameters])
function 或 sb 使用 .NET 替代方案。必须在 C# 中实现对 pthread 的缺失支持。
clr_create_thread
不过这个名字有点误导人,因为它并没有真正创建线程。相反,它需要您的回调并将其安排在ThreadPool上执行。线程池中的线程有些特殊,因为它们不会在回调结束时结束。相反,它们被重用于以后的请求(例如,如果您clr_create_thread
再次调用回调执行可能会在您之前使用的线程上结束)。因此,线程没有什么意义,因为它们不是自愿结束的Join
。ThreadPool
但是,如果您想等待回调完成(AutoResetEvent
并且WaitHandle::WaitAll
是重要部分),您可以使用其他 .net 同步机制:
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";
}
}