Articles of 线程安全

关于僵尸进程和线程的问题

由于我正在阅读关于进程和线程的一些新主题,所以我在脑海中有这些问题。 如果有人能帮助我,我会很高兴。 1)如果一个线程被标记为不可取消,那么进程在关键部分内部被终止会发生什么? 2)我们有一个操作系统已知的程序主线程吗? 我的意思是操作系统给程序的第一个线程一些有益的权利或什么? 3)当我们杀死一个进程,线程不join,他们成为僵尸?

加载共享库的多个副本

我正在运行Linux,我希望能够并行函数调用到一个共享库(.so),这不幸是不是线程安全(我猜它有全局数据结构)。 出于性能的原因,我不想简单地将函数调用包装在一个互斥量中。 我想要做的就是产生4个线程,并将同一个库的4个副本加载到进程内存中。 然后每个线程将函数调用放到它自己的库副本中。 不幸的是,dlopen不允许我加载任何库的更多的实例。 有谁知道任何方法,将允许我不止一次地加载图书馆? (除了制作4个.so文件的副本,每个都有不同的名称)

NetServerEnum创build不会closures的工作线程

当试图解决我以前提出的SO问题时,我发现即使没有我的线程,也会出现问题。 我现在拥有的是一个非常简单的单线程代码,它调用了NetServerEnum() 。 当返回时,它调用NetApiBufferFree()并从main返回,这应该结束进程。 在这一点上,我的线程真正结束,但进程不会退出,因为有4个线程打开(而不是我): 1 * ntdll.dll!TplsTimerSet+0x7c0 (堆栈位于ntdll.dll!WaitForMultipleObjects ) (这个调用NetServerEnum()打开) 3 * ndll.dll!RtValidateHeap+0x170 (堆栈位于ntdll.dll!ZwWaitWorkViaWorkerFactory+0xa ) (这些是我的代码返回时打开) 更新:如果我杀死运行ntdll.dll!TplsTimerSet + 0x7c0(使用进程资源pipe理器)的线程,返回main() ,程序正常退出。 我认为这可能是有用的知道。 更新2:(一些更多的技术信息)我正在使用: MS Visual Studio 2010年终极x64 (SP1Rel) Win7企业SP1代码是C(但编译为c + +开关是)子系统:WINDOWS编译器:cl.exe(使用IDE)所有其他参数是默认的。 我使用自修改的入口点( /ENTRY:"entry" ),它是唯一的function在我的程序中): int entry(void) { SERVER_INFO_101* si; DWORD a,b; NET_API_STATUS c; c = NetServerEnum ( NULL , 101 , (LPBYTE*) &si , MAX_PREFERRED_LENGTH […]

内存映射文件是线程安全的

我想知道是否可以通过使用内存映射文件对单个文件执行multithreading写入,并确保两个线程不写入同一区域(例如,通过交错固定大小的logging),从而减less了同步在应用程序级别,即不使用我的代码中的关键部分或互斥体。 但是,经过Google的search,我还是不确定。 来自微软的这个链接说: 首先,资源明显节省,因为两个进程共享内存的物理页面和用于支持内存映射文件的硬盘存储页面。 其次,只有一组数据,所以所有的观点都是一致的。 这意味着通过一个进程的视图对内存映射文件中的页面进行的更改会自动反映到另一个进程的内存映射文件的公共视图中。 本质上,Windows NT不需要做任何特殊的簿记来确保数据对两个应用程序的完整性。 但它是否适用于属于同一进程的线程? 这将是合理的(因为我的写作是不相交的),但是我不太了解内存映射的底层实现(例如,操作系统要做什么)。 示例用例,其中myFunction由每个线程执行: // crt – index of current thread, in 0..n-1 // n – thread count // memArea – pointer to memory location obtained from mapping a file void myFunction(int crt, int n, int*memArea){ for (int i=1; i<512; i++) memArea[ ( sizeof(int)*( n*i + crt ) […]

LoadLibrary静态/全局和线程

假设我有一个具有以下静态/全局的DLL: ClassA Object; 除了ClassA的实现之外,它还包含一个“常规”的ClassB,如果ClassA还没有被构造,这将不能正常工作(这就是为什么我使ClassA成为静态/全局的原因)。 在Windows中,我相信DLL加载器会在调用ClassB的构造函数时加载这个DLL,对吗? 此时,ClassA将被build造,然后ClassB的build设将随之而来。 如果第二个线程出现并构造ClassB,ClassA将不会被构造,因为它已经被构造了。 现在,我的问题是 – 如果ClassB是由两个线程同时构build的。 所以线程1将开始构buildClassA。 在执行ClassB的构造函数之前,线程2是否等待ClassA完全构造? 换句话说,LoadLibrary()是否使用CriticalSection来确保DLL的静态/全局variables的线程安全的初始化? 我的直觉是'是',但我似乎无法find任何文件说某种方式或其他。

strtok函数线程安全

我花了一些时间来debugging给出分段错误的程序。 这个bug是非常不确定的,而且是间歇性的,这很烦人。 我缩小了对strtok的呼吁。 我怀疑这是调用strtok拆分string在两个不同的线程导致分段错误。 我可以在两个不同的线程中调用strtok吗? 谢谢。

在linux和gcc中的C ++新的运算符线程安全性4

不久我将开始使用共享内存的并行版本的网格细化algorithm。 该大学的一位教授指出,我们必须非常小心线程安全性,因为编译器和stl都不是线程感知的。 我search这个问题,答案取决于编译器(一些尝试有点线程感知)和plattform(如果编译器使用的系统调用是线程安全的)。 所以,在linux中,gcc 4编译器为新运算符生成线程安全的代码? 如果没有, 解决这个问题的最好方法是什么? 也许locking每个电话给新的运营商?