关于C#:将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


启动线程(pthread_createboost::threadstd::thread)的方式与您使用的同步原语正交(stdboost,Intel TBB,libatomic,等等。)。

否则,您将无法在一个应用程序中混合使用使用这些不同API的库。

低级同步原语(例如原子,互斥体和条件变量)可以放置在共享内存中,并由不同进程使用,而根本无需显式创建任何额外的线程。以及OS内核为您创建的主应用程序线程,无需使用任何用户空间API。


the application needs a lot of stack space, and on some platforms requires overriding the default stack size upon creation

std::thread使用pthread_create在支持POSIX的平台上创建线程。您的另一个选择是覆盖pthread_create,设置堆栈大小并调用原始的pthread_create

一个有效的Linux示例(我无法访问MacOS进行尝试):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#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\
"
, __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\
"
, __PRETTY_FUNCTION__); });
    t.join();
}

输出:

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