【问题标题】:Race Condition C thread竞争条件 C 线程
【发布时间】:2016-03-28 12:49:43
【问题描述】:

所以两个线程应该调用两个runTimes函数,runTimes函数应该调用increase_countdecrease_count。最后结果应该是 3。问题是当我运行程序时最后一行代码没有被执行,我无法真正确定是什么导致了竞态条件。

#define MAX_RESOURCES 5


int available_resources = MAX_RESOURCES;
int times = 100000;
pthread_mutex_t mutex;
sem_t semaphore; 

/* decrease available_resources by count resources
* return 0 if sufficient resources available,
* otherwise return -1 */
int decrease_count(int count) {
if (available_resources < count) {
    return -1;
} else {
    available_resources -= count;
    printf("Locked %i resources, now available: %i\n" , count , available_resources);
    return 0;
}
}


/* increase available resources by count */
int increase_count(int count) {
if (count + available_resources > 5) {
    return -1;
} else {
    available_resources += count;
    printf("Freed %i resources, now available: %i\n" , count , available_resources);
    return 0;
}
}


void *runTimes(void *null) {
int i = 0 , result;
while (i < times) {
    result = -1;
    while (result < 0) {result = decrease_count(1);}
    result = -1;
    while (result < 0) {result = increase_count(1);}
    i += 1;
    printf("Count; %i\n",i );
}

return NULL;
}

 int main(int argc, char *argv[])
 {
pthread_t thread1 , thread0;
pthread_t threads [2];

decrease_count(2);

 pthread_create(&thread0, NULL, runTimes, NULL);
 pthread_create(&thread1, NULL, runTimes, NULL);

 int i = 0;
 while( i < 2) {
    pthread_join(threads[i], NULL);
    i++;
}

pthread_exit(NULL);


printf("Currently available resources (should be 3): %i\n" , available_resources);

return 0;
}

【问题讨论】:

  • 请正确缩进您的代码。
  • 更正”?我还是觉得有点乱。

标签: c pthreads semaphore race-condition


【解决方案1】:

最后一行代码没有被执行

这是因为你打电话

pthread_exit(NULL);

在调用它之前

printf("Currently available resources (should be 3): %i\n" , available_resources);

(最后)行。

pthread_exit() 退出当前线程,也就是调用函数的线程。


您显示的代码中的种族与此无关。这可能是因为代码没有对同时访问相同的变量实施任何保护。


你也想加入你创建的话题。

为此改变

pthread_create(&thread0, NULL, runTimes, NULL);
pthread_create(&thread1, NULL, runTimes, NULL);

成为

pthread_create(&threads[0], NULL, runTimes, NULL);
pthread_create(&threads[1], NULL, runTimes, NULL);

【讨论】:

  • 如果我把它放在它无论如何都不会被执行,我该怎么办?
  • 去掉'pthread_exit(NULL);'评论它,删除它,销毁它,消除它,消灭它。
猜你喜欢
  • 1970-01-01
  • 2010-11-21
  • 2013-08-26
  • 1970-01-01
  • 2016-10-12
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多