你如何使用 std::jthread::get_stop_token() ?

问题描述

我很困惑 std::jthread::get_stop_token 是如何设计的,因为它似乎具有固有的竞争条件。

也就是说,执行线程不能简单地对自身调用 std::jthread(如在 this example 中),因为它不能保证 std::jthread 对象实际上是在它被构造的时候开始执行。在我看来,一个线程要使用它自己的 get_stop_token,它(至少)需要一个额外的事件(如 std::latch)来同步它自己的构造。

但是,我在网上没有看到任何有关此问题的示例或提及,因此在我看来,这可能不是预期的用途。它确实看起来相当笨重且容易出错,而且可能效率低下,因为它需要工作线程在继续之前阻塞在主线程上。

那么 get_stop_token 应该如何使用?
是否有一个简单的例子来说明 std::jthread::get_stop_token() 的正确、预期用法

解决方法

here 的示例看来,typedef void (*bgs2_e_rx_callback)(unsigned char reason,unsigned short int n,char * data); void bgs_callbacktest(char* data); /*void test(int* ptest); void test_tab(char* data,char* ptaille); char* concat(const char *s1,const char *s2); static void parse_numeric_rsp(char nb_values,char * data,unsigned long data_len,unsigned long * result);*/ struct teststruct{ short int i ; bgs2_e_rx_callback callback; void* param; }; struct teststruct leteststruct ; int main(){ printf("test for function in structure\n"); char txt[]="i'm a text"; leteststruct.param = txt; leteststruct.callback = &bgs_callbacktest; } void bgs_callbacktest(char* data){ printf("your text: %s\n",leteststruct.param); } 实际上并不打算由客户端代码使用。它由 get_stop_token 在幕后调用并传递给 std::jthread 调用的函数。看来这是必须要做的事情

std::jthread