我正在Windows上编写一个多线程程序。由于我不知道有没有支持C11线程的Windows实现,因此最好的选择是使用本地WinAPI多线程。但是有一个问题。 C库中的某些函数(例如malloc
或I/O函数)被C11标准要求具备线程安全性。但是,即使定义了__STDC_NO_THREADS__
,它们是否仍然需要具备线程安全性呢?如果C实现中不存在线程设施,它们似乎没有必要具备线程安全性,但这真的有所帮助,因为我真的不想在所有I/O函数中都包装互斥锁。
我正在Windows上编写一个多线程程序。由于我不知道有没有支持C11线程的Windows实现,因此最好的选择是使用本地WinAPI多线程。但是有一个问题。 C库中的某些函数(例如malloc
或I/O函数)被C11标准要求具备线程安全性。但是,即使定义了__STDC_NO_THREADS__
,它们是否仍然需要具备线程安全性呢?如果C实现中不存在线程设施,它们似乎没有必要具备线程安全性,但这真的有所帮助,因为我真的不想在所有I/O函数中都包装互斥锁。
_beginthread()
而不是CreateThread()
! - DarkAtom_beginthread
创建,则会导致内存泄漏。该bug已经修复。然而,记录的问题仍然存在。 - IInspectable_beginthread()
,那么你应该使用它。如果 GCC 文档中建议使用 -pthread
而不是 -lpthread
,那么你也应该这样做。如果有人费心记录这些内容,就请相信他们有充分的理由。 - Zan Lynxmalloc()
不会修改静态或线程存储,因此它是线程安全的。 - DarkAtommalloc()
和相关函数(根据7.22.3保证是线程安全的)以及I/O函数(根据7.21.2/7和7.21.2/8保证是线程安全的)。显然,我并没有指的是像strtok()
这样具有静态存储的函数,它们无法保证线程安全。 - DarkAtom__STDC_NO_THREADS__
,它们也需要是线程安全的吗? - DarkAtom即使在C11中,标准内部的原子性或线程安全性保证仅与由标准定义的信号或线程相关。如果通过标准未指定的某些方式创建线程,则该线程可能执行的任何操作(包括其与其他线程的可能交互)都将超出标准的管辖范围。
针对可以创建线程或触发异步信号的系统进行低级编程的高质量实现通常允许程序以超出标准要求的方式与这些内容进行交互,因为标准基本上没有提供任何内容。
最明显且可避免的是那些使用并经常返回子例程静态数据元素的函数,尽管名称上下文是本地的,但它们当然在堆上。它们很少见,但asctime()及其一些朋友让人想起。https://linux.die.net/man/3/asctime手册说已过时,请使用strftime()。然而,任何表现出“状态”的函数可能都有一个内部静态!例如,strtok(): https://linux.die.net/man/3/strtok我从来不喜欢它,更喜欢手动解析字符串而不修改输入,使用指针派生长度。所以要小心。一个好的C程序员可以编写大多数这些库例程,因此可以想象子例程静态(或文件静态全局或全局)用于提供“状态”的情况。
顺便说一句,按照严格的定义,函数应该没有状态,但子例程可以有!在C ++,JAVA等中,方法将其状态保留在对象或类中,并且对于线程支持,可以在任一或两个级别上包括互斥体,或者您可以使JAVA方法“同步”!
asctime()
和strtok()
不需要是线程安全的(而且肯定不是)。我问的是哪些函数需要是线程安全的。另外,我在使用Windows,你为什么要链接Linux man页面呢? - DarkAtom
malloc()
、printf()
等)是否仍然具有线程安全性。 - DarkAtom