Jul*_*ian 2 c++ file-io semaphore
我目前正在尝试将当前运行的线程限制为最大值,例如核心数量.
这一切都做得很好,我每秒有100次完整的数据写入(打开,追加,关闭),但是当不使用信号量作为互斥量(数量> 1)时,订单或写入访问就是伪装的.
使用for循环:
for(int i=0;i<10;i++)
mywrite.writeasnewthread("test.txt","asd"+mywrite.tostring(i));
Run Code Online (Sandbox Code Playgroud)
其中writeasnewthread包含
WaitForSingleObject(this->semaphor,INFINITE);
CreateThread(NULL,0,&threadwrite,(void*)param,0,NULL);
Run Code Online (Sandbox Code Playgroud)
用threadwrite新的线程,包含名称,数据和信号量的param.然后在最后我写的threadwrite中
ReleaseSemaphore(writeparam->This->semaphor,1,NULL);
Run Code Online (Sandbox Code Playgroud)
但是,当我查看我在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
Run Code Online (Sandbox Code Playgroud)
我可能有一些基本的误解,信号量是如何工作的,但我虽然线程会等待信号量再次有一个空闲插槽然后继续工作......
那么,有一种保存文件顺序的好方法吗?或者这会破坏信号量的概念?
问候,朱利安
信号量不会在持有信号量的各种线程之间强加任何关系。它只限制一次可以成功获取信号量的实体数量。
信号量的定义中没有任何与线程调度有关的内容。在您的示例中,信号量运行正常。
如果您希望在文件中按特定顺序写入,为什么要使用线程?只需按照您想要的顺序从主线程进行写入,一切都会好起来的。
当您希望事情以未定义的顺序发生时,可以使用线程。您可以使用互斥锁、信号量、fifos 等在线程之间强加一些顺序,但是如果您想要严格的一个接一个的操作顺序,您可能不应该使用线程。