Swoole4协程的出现让PHP在底层从原来的串行模式转变为并发模式。有很多PHPC/C++扩展在开发过程中没有考虑并发和重入问题,导致无法在Swoole协程中使用。本文将详细讲解如何为协程编写并发安全的C/C++代码。可重入示例代码:intt;voidtest1(int*x,int*y){t=*x;*x=*y;//fun1函数中可能有协程切换fun1();//错误代码*y=t;}t是一个全局变量或static静态变量。协程A中调用了test1函数,使用了全局变量t。在函数中调用fun1()时,如果这个函数发生了协程切换,此时如果另一个协程B也执行了test1函数,那么t的值可能会被修改。当协程B被挂起,回到协程A,此时*y=t,会得到一个错误的值对栈内存的引用也是一个严重的风险点。协程1将自己栈内存的指针发送给另一个协程2,协程1退出时会释放协程栈内存。协程2的生命周期比1长,继续读写这块内存会导致segmentfault。示例:voidco1(){charbuf[2048];//这里开始一个新的协程,buf是协程1栈上的内存co2(buf);//协程1退出时释放栈内存}voidco2(char*buf){for(inti=0;i<2048;i++){Coroutine::sleep(1);//这里buf内存可能已经释放了buf[i]=1;}}协程安全代码为了保证安全,在Swoole4协程编程中:不使用静态变量和全局变量,坚持只使用局部变量。如果一定要访问全局变量,必须保证只用于计算逻辑,不能有导致协程切换的IO或Sleep。该操作不调用任何其他不可重入函数,也不引用堆栈上的内存
