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

时间:2013-05-16 12:59:20

标签: c++ file-io semaphore

我目前正在尝试将当前正在运行的线程限制为最大值,例如芯量。

这一切都做得很好,我每秒有100个完整的数据写入(打开,追加,关闭),但是当不使用信号量作为互斥量(数量> 1)时,订单或写访问权限是canged。

使用for循环:

    for(int i=0;i<10;i++)
            mywrite.writeasnewthread("test.txt","asd"+mywrite.tostring(i)); 

其中writeasnewthread包含

    WaitForSingleObject(this->semaphor,INFINITE);
    CreateThread(NULL,0,&threadwrite,(void*)param,0,NULL);

用threadwrite新线程,param包含名称,数据和信号量。 然后在最后的threadwrite中调用

    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

我可能有一些基本的误解,信号量是如何工作的,但是我虽然线程会等待信号量再次获得一个空闲时段然后继续工作......

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

此致 儒略

2 个答案:

答案 0 :(得分:5)

嗯,简单的答案是否定的。操作系统可以自由安排线程按照自己喜欢的顺序执行,并且很可能不是按照您创建的顺序执行。

答案 1 :(得分:4)

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

信号量的定义中没有任何内容与线程调度有任何关系。在您的示例中,信号量正常运行。

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

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