我正在尝试实现粗线程中断。

“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)可能是一个不错的选择。

09-26 23:19