C++ c++;信号量不考虑调用顺序

C++ c++;信号量不考虑调用顺序,c++,file-io,semaphore,C++,File Io,Semaphore,我目前正试图将当前运行的线程限制在最大数量,例如核心数量 这一切都做得很好,我每秒大约有100次完整的数据写入(打开、追加、关闭),但当不使用信号量作为互斥(数量>1)时,顺序或写入访问被取消 使用for循环: for(int i=0;i<10;i++) mywrite.writeasnewthread("test.txt","asd"+mywrite.tostring(i)); 使用threadwrite编写新线程,param包含名称、数据和信号量。

我目前正试图将当前运行的线程限制在最大数量,例如核心数量

这一切都做得很好,我每秒大约有100次完整的数据写入(打开、追加、关闭),但当不使用信号量作为互斥(数量>1)时,顺序或写入访问被取消

使用for循环:

    for(int i=0;i<10;i++)
            mywrite.writeasnewthread("test.txt","asd"+mywrite.tostring(i)); 
使用threadwrite编写新线程,param包含名称、数据和信号量。 然后在线程中写在最后我调用

    ReleaseSemaphore(writeparam->This->semaphor,1,NULL);
但是,当我查看我用threadwrite编写的文件时,会出现如下情况

2013-5-16 14:41:25 asd0
2013-5-16 14:41:25 asd3
2013-5-16 14:41:25 asd5
2013-5-16 14:41:25 asd7
2013-5-16 14:41:25 asd1
2013-5-16 14:41:25 asd8
2013-5-16 14:41:25 asd9
2013-5-16 14:41:25 asd6
2013-5-16 14:41:25 asd4
2013-5-16 14:41:25 asd2
我可能对信号量的工作原理有一些基本的误解,但我认为线程会等待信号量再次有一个空闲槽,然后开始工作

那么,有没有一种很好的方法来保持文件的顺序呢?或者这会破坏信号量的概念吗

问候,,
Julian

好吧,简单的答案是否定的。操作系统可以自由地安排线程以其喜欢的任何顺序执行,并且很可能不会按照您创建它们的顺序执行。

信号量不会在持有信号量的各个线程之间强加任何关系。它只限制一次可以成功获取信号量的实体数量

信号量的定义中没有与线程调度相关的内容。在您的示例中,信号灯工作正常

如果您希望在文件中按特定顺序写入,为什么要使用线程呢?只要按照您想要的顺序从主线程进行写操作,一切都会很好


当您希望事情以未定义的顺序发生时,可以使用线程。您可以使用互斥量、信号量、FIFO等在线程之间强加一些顺序,但是如果您想要一个接一个的严格操作顺序,您可能不应该使用线程。

顺便说一句(Robert的回答是正确的),这有什么用?如果写操作按严格的顺序执行,您将无法获得任何并发性@无用的好吧,我计划更好地利用使用线程的处理器,但现在我认为一个互斥锁就足够了,所以一个额外的线程处理IO,主线程忙于其他事情,以及确保在保存大量数据时没有争用条件的互斥锁现在就足够了。老实说,这些写操作非常小,可能比在不同线程中进行同步所需的成本更低。@asd1可能是无用的写操作。但这只是我想做的一个最小的例子。稍后,在主线程中会实时运行数据分析,速度约为1000/s,在繁忙的情况下,每隔30分钟或当用户需要保存一些MB数据时,不会影响数据获取。所以我猜想,至少有一个不同的线程在这里确实有意义^ ^也许把实时数据分析放在一个专用线程中,要么使用一个专用的I/O线程,要么考虑异步I/O.。
2013-5-16 14:41:25 asd0
2013-5-16 14:41:25 asd3
2013-5-16 14:41:25 asd5
2013-5-16 14:41:25 asd7
2013-5-16 14:41:25 asd1
2013-5-16 14:41:25 asd8
2013-5-16 14:41:25 asd9
2013-5-16 14:41:25 asd6
2013-5-16 14:41:25 asd4
2013-5-16 14:41:25 asd2