所以我有 pthreads 在 Windows 上使用 PHP,但是我如何使用 phalanger 3.0 编译和运行我的 pthreads 实现?目前,它以 0 个错误/0 个警告构建,但是当我运行它时,它说
CompileError: The class 'ThreadTest' is incomplete - its base class or interface is unknown in C:phpteststhread.php on line 10, column 1.
我在 Phalanger install dir 中看到它有 php 扩展名.dll;我下载的 php_pthreads zip 有.pdb pthreads .dll的中间文件,所以有没有办法让 Phalanger 编译和运行 pthreads?
Phalanger 不支持 pthreads。
您可以通过 clr_create_thread(callback [, parameters])
函数或 sb 使用 .NET 替代方案。 必须在 C# 中实现对 pthreads 的缺失支持。
不过,clr_create_thread
有点误导性的名字,因为它并没有真正创建线程。相反,它接受您的回调并将其安排在线程池上执行。线程池上的线程有些特殊,因为它们不会在回调结束时结束。相反,它们被重用于以后的请求(例如,如果您再次调用clr_create_thread
,回调执行可能会在您之前使用的线程上结束)。因此,Join
ThreadPool
线程没有什么意义,因为它们不是自愿结束的。但是,如果要等待回调完成,可以使用其他 .net 同步机制(AutoResetEvent
和WaitHandle::WaitAll
是重要部分):
use SystemThreading;
class ThreadTest
{
public static function main()
{
(new self)->run();
}
public function run()
{
$that = $this;
$finished = [];
for ($i = 0; $i < 5; $i++) {
$finished[$i] = new ThreadingAutoResetEvent(false);
clr_create_thread(function() use ($that, $finished, $i) {
$that->inathread();
$finished[$i]->Set();
});
}
ThreadingWaitHandle::WaitAll($finished);
echo "Main endedn";
}
public function inathread()
{
$limit = rand(0, 15);
$threadId = ThreadingThread::$CurrentThread->ManagedThreadId->ToString();
echo "n thread $threadId limit: " . $limit . " n";
for ($i = 0; $i < $limit; $i++) {
echo "n thread " . $threadId . " executing n";
ThreadingThread::Sleep(1000);
}
echo "n thread $threadId ended n";
}
}