Linux Pthread库包含2个函数来设置线程的取消状态和取消类型:
int pthread_setcancelstate(int state, int *oldstate)
int pthread_setcanceltype(int type, int *oldtype)
如何接收这些状态和类型?是否有类似pthread_getcancelstate
或的功能pthread_getcanceltype
?我在互联网上搜索,但没有找到解决方案。
由于功能pthread_setcancelstate()
和pthread_setcanceltype()
通过参数列表返回老态,你可以调用函数来设置的“安全”状态/类型(PTHREAD_CANCEL_DISABLE
以及PTHREAD_CANCEL_DEFERRED
,我认为),如果旧的国家/类型是不一样的,调用该函数第二次恢复旧状态/类型。新状态/类型似乎没有“ no-op”值。
int pthread_getcancelstate(int *oldstate)
{
int dont_care;
int rc = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, oldstate);
if (rc == 0 && *oldstate != PTHREAD_CANCEL_DISABLE)
rc = pthread_setcancelstate(*oldstate, &dont_care);
return rc;
}
int pthread_getcanceltype(int *oldtype)
{
int dont_care;
int rc = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, oldtype);
if (rc == 0 && *oldtype != PTHREAD_CANCEL_DEFERRED)
rc = pthread_setcanceltype(*oldtype, &dont_care);
return rc;
}
另一个状态是PTHREAD_CANCEL_ENABLE
,另一个类型是PTHREAD_CANCEL_ASYNCHRONOUS
。
在macOS上这些功能的手册页上确实说允许为旧状态/类型传递空指针,因此可以dont_care
在macOS上消除该变量。但是,POSIX规范和(RHEL 7.4)Linux上的手册页都没有说允许使用空指针。上面的代码在这两个平台上均应安全运行。
该代码还侵入了保留供实现使用的名称空间-实现可以选择添加一个或两个pthread_getcancelstate()
或两者pthread_getcanceltype()
(具有相同或不同的接口),除了重命名上面显示的功能外别无选择。添加_np
(非便携式)后缀可能也无济于事。实现可以选择使用带后缀的名称。
有了这些函数的适当声明以及<pthread.h>
包括的标头,代码现在可以干净地编译(但是在先前版本中缺少复制/粘贴的编辑)。不幸的是,先前的警告是合理的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句