所以我在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?
答案 0 :(得分:1)
Phalanger没有对pthreads的支持。
您可以通过clr_create_thread(callback [, parameters])
函数或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";
}
}