你如何让 pthreads 使用 Phalanger 编译



所以我有 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 同步机制(AutoResetEventWaitHandle::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";
    }
}

相关内容

  • 没有找到相关文章

最新更新