0

所以我有 pthreads 在 Windows 上与 PHP 一起工作,但是我如何使用 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])function 或 sb 使用 .NET 替代方案。必须在 C# 中实现对 pthread 的缺失支持。

clr_create_thread不过这个名字有点误导人,因为它并没有真正创建线程。相反,它需要您的回调并将其安排在ThreadPool上执行。线程池中的线程有些特殊,因为它们不会在回调结束时结束。相反,它们被重用于以后的请求(例如,如果您clr_create_thread再次调用回调执行可能会在您之前使用的线程上结束)。因此,线程没有什么意义,因为它们不是自愿结束的JoinThreadPool但是,如果您想等待回调完成(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";
    }
}
于 2014-03-30T10:22:30.180 回答