我正在尝试实现粗线程中断。
“interruptRequested”变量经常被检查。在操作系统类(class)中,我们了解了饥饿-在这里还是在类似情况下有可能吗?我知道示例程序在运行时的行为与我预期的一样,但这可能只是a幸。
这是我正在做的简化版本:
//Compile with -lpthread
#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
using namespace std;
bool interruptRequested;
pthread_mutex_t spamMutex;
void *Spam(void *);
int main(int argc, char *argv[])
{
pthread_t tid;
interruptRequested = false;
unsigned long long int timeStarted = time(NULL);
pthread_create(&tid, NULL, Spam, NULL);
unsigned long long int difference = 0;
while (true)
{
pthread_yield();
difference = (time(NULL) - timeStarted);
if ( difference >= 5)//Spam the terminal for 5 seconds
{
//while (pthread_mutex_trylock(&spamMutex));
interruptRequested = true;
//pthread_mutex_unlock(&spamMutex);
break;
}
}
return 0;
}
void *Spam (void *arg)
{
while (true)
{
//while (pthread_mutex_trylock(&spamMutex));
if (interruptRequested == true)
{
//pthread_mutex_unlock(&spamMutex);
break;
}
//pthread_mutex_unlock(&spamMutex);
cout << "I'm an ugly elf" << endl;
pthread_yield();
}
interruptRequested = false;
pthread_exit (0);
}
实际上,在实际代码中,我没有使用时差方法。我的程序将从服务器接收消息,这时我需要中断线程。
最佳答案
是的,您必须首先使用互斥量来保护对各自块中interruptRequested
的读取和写入。
即使它看起来按预期工作,也可能实际上不起作用。软件不接受99%的成功率。同样,您的测试程序是微不足道的-很有可能在现实世界中(无声或神秘地)失败。
用volatile(或原子,在许多情况下)代替锁是一个坏主意。该模型最终会失败,尽管它通常在轻负载下似乎可以正常工作。有一些极端的情况,但是您应该放弃使用volatile代替使用锁定的正确设计的关联。实际上,您可以通过将interruptRequested
设置为int
并仅使用增量/减量来对此进行测试。在重负载下-您可以迅速超过[0 ... 1]。
在声明/读取/写入interruptRequested时,您经常会使用volatile和/或atomic(同样,我建议您进行int / inc / dec / bounds检查,尤其是在学习时)。如果读取和写入均被锁定(在这种情况下应锁定),则使用原子读取/写入将无济于事。
对于您的程序,条件(pthread_cond_t
)可能是一个不错的选择。