如何使用Phalanger编译pthreads?

时间:2014-03-30 00:08:35

标签: php multithreading compilation pthreads phalanger

所以我在Windows上使用pthreads使用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' s;和我下载的php_pthreads zip有ppreads .dll的.pdb中间文件,所以有没有办法让Phalanger编译和运行pthreads?

1 个答案:

答案 0 :(得分:1)

Phalanger没有对pthreads的支持。

您可以通过clr_create_thread(callback [, parameters])函数或sb使用.NET替代方案。必须在C#中实现对pthread的缺少支持。

clr_create_thread虽然名称有点误导,但它并没有真正创建一个线程。相反,它需要您的回调并安排它在ThreadPool上执行。线程池上的线程有些特殊,因为它们在回调结束时不会结束。相反,它们会被重用于以后的请求(例如,如果再次调用clr_create_thread,则回调执行可能最终会出现在您之前使用的线程上)。因此,在Join ThreadPool个帖子中没有任何意义,因为它们不是自愿结束的。但是,如果您想等待回调完成(AutoResetEventWaitHandle::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";
    }
}