簡體   English   中英

將 boost::thread 與 C++11 std::mutex 混合使用是否安全?

[英]Is it safe to mix boost::thread with C++11 std::mutex?

在通過 boost 啟動其線程的程序中使用std::mutex及其親屬是否安全?

(使用std::thread不是我的選擇(我認為),因為應用程序需要大量堆棧空間,並且在某些平台上需要在創建時覆蓋默認堆棧大小。)

是的,您可以在使用boost::thread創建的線程中使用std::mutex

應用程序需要大量堆棧空間,並且在某些平台上需要在創建時覆蓋默認堆棧大小

std::thread使用pthread_create在支持 POSIX 的平台上創建線程。 您的另一個選擇是覆蓋pthread_create ,設置堆棧大小並調用原始pthread_create

一個有效的 Linux 示例(我無法訪問 MacOS 以在那里嘗試):

#include <cstdio>
#include <thread>
#include <dlfcn.h>

namespace {

size_t const STACK_SIZE = 8 * 1024 * 1024;

int pthread_create_override(pthread_t* thread, pthread_attr_t const* attr, void*(*start_routine)(void*), void* arg) noexcept {
    std::printf("%s\n", __PRETTY_FUNCTION__);

    pthread_attr_t attr2;
    if(attr)
        attr2 = *attr;
    else
        if(pthread_attr_init(&attr2))
            std::abort();

    size_t stacksize = 0;
    pthread_attr_getstacksize(&attr2, &stacksize);
    if(stacksize < STACK_SIZE) {
        if(pthread_attr_setstacksize(&attr2, STACK_SIZE))
            std::abort();
    }

    static auto const real_pthread_create = reinterpret_cast<decltype(&pthread_create)>(::dlsym(RTLD_NEXT, "pthread_create"));
    int rc = real_pthread_create(thread, &attr2, start_routine, arg);

    if(!attr)
        pthread_attr_destroy(&attr2);

    return rc;
}

} // namespace

extern "C" {

int pthread_create(pthread_t* thread, pthread_attr_t const* attr, void*(*start_routine)(void*), void* arg) {
    return pthread_create_override(thread, attr, start_routine, arg);
}

} // namespace

int main() {
    std::thread t([]() { std::printf("%s\n", __PRETTY_FUNCTION__); });
    t.join();
}

輸出:

int {anonymous}::pthread_create_override(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)
main()::<lambda()>

您啟動線程的方式( pthread_createboost::threadstd::thread )與您使用的同步原語正交( std vs boost vs Intel TBB vs libatomic vs etc..)。

否則,您將無法在一個應用程序中混合和匹配使用這些不同 API 的庫。

原子、互斥體和條件變量等低級同步原語可以放置在共享內存中,供不同進程使用,而根本無需顯式創建任何額外線程。 以及主應用程序線程是由操作系統內核為您創建的,而無需使用任何用戶空間 API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM