在thinkphp中使用线程报异常,但是去掉初始化线程的代码就正常

在thinkphp中使用线程,pthread,在本地windows下执行正常,但是在linux下执行总会报错Fatalerror:Calltoamemberfunctio... 在thinkphp中使用线程,pthread,在本地windows下执行正常,但是在linux下执行总会报错Fatal error: Call to a member function assign() on null in /usr/local/www/search/ThinkPHP/Library/Think/Controller.class.php on line 122

异常显示在一个空指针上调用了assign,但是我在代码里调用的assign都是controller的$this->assign,不可能是空啊,求大神指到一下,是不是thinkphp使用线程有什么限制呢
展开
 我来答
山水阿锐
2015-04-09 · TA获得超过34.3万个赞
知道顶级答主
回答量:23.7万
采纳率:91%
帮助的人:3.2亿
展开全部
您好,一种数据争用情况:同步被完全遗忘。这种争用很少有良性的情况,也就是说虽然它们是正确的,但大部分都是因为这种正确性的根基存在问题。
这种问题通常不是很明显。例如,某个对象可能是某个大型复杂对象图表的一部分,而该图表恰好可使用静态变量访问,或在创建新线程或将工作排入线程池时通过将某个对象作为闭包的一部分进行传递可变为共享图表。
当对象(图表)从私有变为共享时,一定要多加注意。这称为发布,在后面的隔离上下文中会对此加以讨论。反之称为私有化,即对象(图表)再次从共享变为私有。
对这种问题的解决方案是添加正确的同步。在计数器示例中,我可以使用简单的联锁:
static class Counter {
internal static volatile int s_curr = 0;
internal static int GetNext() {
return Interlocked.Increment(ref s_curr);
}
}

它之所以起作用,是因为更新被限定在单一内存位置,还因为(这一点非常方便)存在硬件指令 (LOCK INC),它相当于我尝试进行原子化操作的软件语句。
或者,我可以使用成熟的锁定:
static class Counter {
internal static int s_curr = 0;
private static object s_currLock = new object();
internal static int GetNext() {
lock (s_currLock) {
return s_curr++;
}
}
}

lock 语句可确保试图访问 GetNext 的所有线程彼此之间互斥,并且它使用 CLR System.Threading.Monitor 类。C++ 程序使用 CRITICAL_SECTION 来实现相同目的。虽然对这个特定的示例不必使用锁定,但当涉及多个操作时,几乎不可能将其并入单个互锁操作中。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式