实例解析C++CLI线程之线程状态持久性

实例解析C++CLI线程之线程状态持久性,第1张

实例解析C++CLI线程之线程状态持久性,第2张

其他形式的同步

我们可以通过使用类监视器和类线程中的一些函数来直接控制线程的同步。请看例1。

示例1:

使用命名空间系统;
使用命名空间System::Threading;

int main()
{
/* 1 */messagebuffer^ m = gcnew message buffer;

/* 2a */processmessages^ pm = gcnew process messages(m);
/* 2b */thread^ PMT = gcnew thread(gcnew threadstart(pm,& process messages::processmessagesentrypoint));
/* 2c */PMT-> Start();

/* 3a */createmessages^ cm = gcnew create messages(m);
/* 3b */thread^ CMT = gcnew thread(gcnew threadstart(cm,& create messages::createmessagesentrypoint));
/* 3c */CMT-> Start();

/* 4 */CMT-> Join();
/* 5 */PMT-> Interrupt();
/* 6 */PMT-> Join();

Console::WriteLine("主线程终止");
}

public ref类message buffer
{
string^ message text;
public:
void setmessage(string^ s)
{
/* 7 */monitor::enter(this);
message text = s;
/*8*/ Monitor::Pulse(这个);
Console::WriteLine(" Set new message { 0 } ",message text);
Monitor::Exit(this);
}

void process messages()
{
/* 9 */Monitor::Enter(this);
while(true)
{
try
{
/* 10 */Monitor::Wait(this);
}
catch(threadinterruptedexception^ e)
{
console::writeline(" process message interrupted ");
退货;
}

Console::WriteLine("已处理的新消息{0} ",message text);
}
Monitor::Exit(this);
}
};

公共引用类create messages
{
messagebuffer^消息;
public:
createmessages(messagebuffer^ m)
{
msg = m;
}

void CreateMessagesEntryPoint()
{
for(int I = 1;I {
msg-> set message(String::Concat(" M-",I . ToString()));
线程::睡眠(2000);
}
Console::WriteLine(" create messages线程终止");
}
};

public ref class process messages
{
messagebuffer^消息;
public:
processmessages(messagebuffer^ m)
{
msg = m;
}

void ProcessMessagesEntryPoint()
{
msg-> process messages();
Console::WriteLine(" process messages线程终止");
}
};

在mark 1中,创建MessageBuffer类型的共享缓冲区;接下来,在标记2a、2b、2c中,创建线程来处理放置在缓冲器中的每条信息;图3a、3b和3c也创建了一个线程,并将五条连续的信息放在共享缓冲区中进行处理。这两个线程已经同步,所以处理器线程必须等到有东西放入缓冲区后才能处理,第二个消息不能放在前一个消息处理之前。在标签4中,它将一直等到创建者线程完成它的工作。

执行标签5时,处理器线程必须处理所有创建者线程放入的信息,因为Thread::Interrupt用于阻止它工作,它继续等待标签6中调用的Thread::Join。这个函数允许调用线程阻塞自己,直到其他线程结束。(线程可以指定等待时间,而不是无限期等待。)

CreateMessages这个线程非常清楚。它将5条消息写入共享缓冲区,并在每条消息之间等待2秒钟。要将一个线程挂起一段给定的时间(以毫秒为单位),我们调用Thread::Sleep,其中休眠的线程可以继续执行,因为运行时环境,而不是另一个线程。

线程ProcessMessages甚至更简单,因为它使用MessageBuffer类来完成所有工作。MessageBuffer类中的函数是同步的,因此同一时间只有一个函数可以访问共享缓冲区。

主程序先启动处理器线程,这个线程会执行ProcessMessages,会获得父对象的同步锁;然而,它立即调用了tag 10中的Wait函数,这将使它一直等待,直到被告知再次运行。在此期间,它还移交了同步锁,从而允许创建者线程获得同步锁并执行SetMessage。一旦函数将新信息放入共享缓冲区,它将调用mark 8中的Pulse,这允许任何等待同步锁的线程被唤醒并继续执行。但是,在SetMessage的执行完成之前,这些都不会发生,因为在函数返回之前,不可能移交同步锁。如果发生这种情况,处理器线程将重新获得同步锁,并在标记10之后继续执行。这里应该注意,一个线程可以无限期等待,也可以一直等到指定的时间到来。1是程序的输出。

插入1:

设置新消息M-1
已处理新消息M-1
设置新消息M-2
已处理新消息M-2
设置新消息M-3
已处理新消息M-4
已处理新消息M-4
设置新消息M-5
已处理新消息M-5
创建消息线程终止
进程消息中断

请注意,处理器线程在创建者线程之前开始。如果以相反的顺序启动,第一条消息将被添加,而不需要处理器线程等待。此时,没有可用于唤醒的处理器线程。当处理器线程运行到它的第一个函数调用wait时,它将错过第一个消息,只有当第二个消息被存储时才被唤醒。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 实例解析C++CLI线程之线程状态持久性

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情