; \
} else { \
return array[TSRM_UNSHUFFLE_RSRC_ID(offset)]; \
}
就是根据传入 tsrm_tls_entry
和 storage
的数组下标 offset
,然后返回该全局变量在该线程的 storage
数组中的地址。到这里就明白了在多线程中获取全局变量宏 TSRMG
宏定义了。
其实这在我们写扩展的时候会经常用到:
#define TSRMLS_D void ***tsrm_ls /* 不带逗号,一般是唯一参数的时候,定义时用 */
#define TSRMLS_DC , TSRMLS_D /* 也是定义时用,不过参数前面有其他参数,所以需要个逗号 */
#define TSRMLS_C tsrm_ls
#define TSRMLS_CC , TSRMLS_C
NOTICE 写扩展的时候可能很多同学都分不清楚到底用哪一个,通过宏展开我们可以看到,他们分别是带逗号和不带逗号,以及申明及调用,那么英语中“D"就是代表:Define,而 后面的"C"是 Comma,逗号,前面的"C"就是Call。
以上为ZTS模式下的定义,非ZTS模式下其定义全部为空。
参考资料
本文来源于:https://github.com/zhoumengkang/tipi/blob/master/book/chapt08/08-03-zend-thread-safe-in-php.markdown?spm=5176.100239.blogcont60787.4.Mvv5xg&file=08-03-zend-thread-safe-in-php.markdown