【发布时间】:2014-04-14 21:41:54
【问题描述】:
这是一个基本代码,我的目标是打印出 AAABBCAAABBC....等等。
- Semaphore(int, int) 中两个参数的意义/意义是什么?
- 谁能解释为什么我得到输出 BBAAABBC 然后它就结束了?
总的来说,当我对代码进行更改并观察输出时,我真的很难看到一种模式。
#include "stdafx.h"
using namespace System;
using namespace System::Threading;
ref class PrintTasks
{
private:
static Semaphore ^canPrintA = gcnew Semaphore(0,3);
static Semaphore ^canPrintB = gcnew Semaphore(2,2);
//static Semaphore ^canPrintC = gcnew Semaphore(0,1);
static Semaphore ^Idle = gcnew Semaphore(0,3);
public: static bool runFlag = true;
public:
void PrintA(Object^ name) {
while (runFlag) {
canPrintA->WaitOne();
Console::Write("{0}\n", "A");
Idle->Release();
}
}
void PrintB(Object^ name) {
while (runFlag) {
canPrintB->WaitOne();
Console::Write("{0}\n", "B");
Idle->Release();
}
}
void PrintC(Object^ name) {
while (runFlag) {
Idle->WaitOne();
Idle->WaitOne();
Console::Write("{0}\n", "C");
canPrintA->Release(3);
Idle->WaitOne();
Idle->WaitOne();
Idle->WaitOne();
canPrintB->Release(2);
//Console::Write("{0}\n", "C");
}
}
};
int main(array<System::String ^> ^args)
{
PrintTasks ^tasks = gcnew PrintTasks();
// First Method
Thread ^thread1 = gcnew Thread ( gcnew ParameterizedThreadStart( tasks, &PrintTasks::PrintA ) );
Thread ^thread2 = gcnew Thread ( gcnew ParameterizedThreadStart( tasks, &PrintTasks::PrintB ) );
Thread ^thread3 = gcnew Thread ( gcnew ParameterizedThreadStart( tasks, &PrintTasks::PrintC ) );
thread1->Start("printA");
thread2->Start("printB");
thread3->Start("printC");
Thread::Sleep(50);
PrintTasks::runFlag=false;
thread3->Abort();
thread2->Abort();
thread1->Abort();
return 0;
}
【问题讨论】:
-
1) msdn.microsoft.com/en-us/library/… : "初始化 Semaphore 类的新实例,指定并发条目的最大数量并可选择保留一些条目。"
-
好的...但是将其设置为 Semaphore(2,2) 有什么作用?
-
您不明白还是根本没有阅读?如果 1:你知道信号量是用来做什么的吗?
-
你不能使用一个信号量来订购 3 个线程,它需要三个线程。允许一个线程释放另一个线程。您通常会改用三个 AutoResetEvents。整个方法一开始是错误的,如果您希望 ABC 按顺序出现,那么只需使用 one 打印 A、B、然后 C 的线程。让更多线程等待是没有意义的轮到他们了,这既浪费又慢。
-
我读了一遍,但还是一头雾水。
标签: .net multithreading c++-cli semaphore