gpt4 book ai didi

c++ - 推断程序是否要使用线程

转载 作者:行者123 更新时间:2023-12-01 14:20:16 26 4
gpt4 key购买 nike

线程安全或线程兼容的代码是好的。
然而,在某些情况下,如果知道程序不会使用线程,则可以以不同的方式(更简单或更有效地)实现事物。
例如,我曾经听说过 std::shared_ptr 之类的事情。可以使用不同的实现来优化非线程情况(但我找不到引用)。
我认为历史std::string在某些实现中可以在非线程代码中使用写时复制。
我不赞成也不反对这些技术,但 我想知道是否有一种方法(至少是名义上的方法)在编译时确定代码是否是为了使用线程而编译的。
我能得到的最接近的是意识到线程代码通常是(?)用 -pthreads 编译的。 (不是 -lpthreads )编译器选项。
(不确定这是硬性要求还是只是推荐。)
依次-pthreads定义了一些宏,比如 _REENTRANT_THREAD_SAFE ,至少在 gccclang .
在一些 some answers在 SO 中,我还读到它们已过时。
这些宏是确定程序是否打算与线程一起使用的正确方法吗? (例如,从同一个程序启动的线程)。是否有其他机制可以在编译时检测到这一点?检测方法的可信度如何?

编辑 :由于这个问题显然可以应用于许多上下文,让我举一个具体的例子:
我正在编写一个仅包含头文件的库,该库内部使用了另一个 3rd 方库。我想知道我是否应该将该库初始化为线程安全的(或至少提供一定级别的线程支持)。如果我假设线程支持的最高级别,但库的用户不会使用线程,那么将无偿支付费用。由于第三个库是一个实现细节,我虽然可以根据猜测来决定请求的线程安全级别。

编辑2 (2021):我偶然发现了这个历史悠久的(但有影响力的)图书馆 Blitz++,它在 documentation 中说(强调我的)

8.1 Blitz++ and thread safety

To enable thread-safety in Blitz++, you need to do one of thesethings:

  • Compile with gcc -pthread, or CC -mt under Solaris. (These options define_REENTRANT,which tells Blitz++ to generate thread-safe code).
  • Compile with -DBZ_THREADSAFE, or #define BZ_THREADSAFE before including any Blitz++ headers.

In threadsafe mode, Blitz++ array reference counts are safeguarded bya mutex. By default, pthread mutexes are used. If you would prefer adifferent mutex implementation, add the appropriate BZ_MUTEX macros to<blitz/blitz.h> and send them toblitz-dev@oonumerics.org forincorporation. Blitz++ does not do locking for every array elementaccess; this would result in terrible performance. It is the job ofthe library user to ensure that appropriate synchronization is used.


所以似乎在某个时候 _REENTRANT被用作需要多线程代码的线索。
也许这是一个非常古老的引用,值得认真对待。

最佳答案

How confident would the detection method be?



并不真地。即使您可以明确检测代码是否被编译为用于多线程,但并非所有内容都必须是线程安全的。

默认情况下使所有内容都是线程安全的,即使它只被单个线程使用也会违背您的方法的目的。如果您不想为不使用的内容付费,则需要更细粒度的控制来打开/关闭线程安全。

如果您的类具有线程安全和非线程安全版本,则可以使用模板参数
class <bool isThreadSafe> Foo;

并让用户根据具体情况决定。

关于c++ - 推断程序是否要使用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61999460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com