3

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

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

使用 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 新线程,参数包含名称、数据和信号量。然后在最后的线程写入中我调用

    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

我可能对信号量的工作原理有一些基本的误解,但我虽然线程会等待信号量再次有一个空闲插槽然后开始工作......

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

问候,朱利安

4

2 回答 2

6

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

于 2013-05-16T13:05:35.373 回答
5

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

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

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

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

于 2013-05-16T13:28:10.330 回答