【问题标题】:Race condition in recursive POSIX thread code?递归POSIX线程代码中的竞争条件?
【发布时间】:2017-10-23 17:11:21
【问题描述】:

我正在编写代码以将 x^2+1 的积分计算为 POSIX C 代码,方法是递归地将部分切成两半。

我知道,我可以使用图书馆,它只是用于学习。


e1 和 e2 将在我的 main 函数中初始化,直接在调用与参数集成之前,如下所示:

e1 = 10E-2;
e2 = 2E-4;
integrate(1.0, 2.0)

代码如下所示:

float e1, e2;

float f(float x)
{
    return pow(x, 2) + 1;
}

float f1(float x)
{
    return 2 * x;
}

typedef struct integrateArgs
{
    float a;
    float b;
    float result;
} integrateArgs;

float integrate(float a, float b);
void* integrateAsThread(void* args)
{
    integrateArgs* myArgs = (integrateArgs*)args;
    myArgs->result = integrate(myArgs->a, myArgs->b);
    return NULL;
}

float integrate(float a, float b)
{
    float diff = b - a;
    if(a < 0 || a >= b || diff > 2 || e1 <= 0 || e2 <= 0)
    {
        return -1;
    }

    float x1 = (a + b) / 2;
    float x2 = f(x1);
    if((f1(x1) / x2) > e1 && diff > e2)
    {
        float half = diff / 2;
        float newCenter = a + half;

        integrateArgs rightPart = { .a = newCenter, .b = b };

        pthread_t thread;
        pthread_create(&thread, NULL, integrateAsThread, (void*)&rightPart);
        float left = integrate(a, newCenter);
        pthread_join(thread, NULL);

        return left + rightPart.result;
    }
    else
    {
        return diff * x2;
    }
}

虽然我不知道在哪里,但似乎存在竞争条件。如果我将集成方法更改为:

float left = integrate(a, newCenter);
pthread_t thread;
pthread_create(&thread, NULL, integrateAsThread, (void*)&rightPart);
pthread_join(thread, NULL);

实际上消除了并行性,它工作正常。如果我使用第一个版本,每次执行的结果都会有所不同。

任何提示,我做错了什么?

【问题讨论】:

  • 我没有发现问题。您能否添加缺少的位以使其可运行?

标签: c multithreading recursion posix race-condition


【解决方案1】:

您没有检查pthread_create 的返回值。很有可能是你的代码创建了太多线程,超出了操作系统的限制,然后一些子任务就永远执行不下去了,得到错误的结果。

【讨论】:

  • 你是对的。实际上它有时会返回 35 作为错误代码。基于Linux System Errors,这意味着“会发生资源死锁”。现在我处理了这个错误,它可以工作了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 2021-06-04
相关资源
最近更新 更多