【问题标题】:Understanding race condition [duplicate]了解竞争条件[重复]
【发布时间】:2015-06-27 15:49:06
【问题描述】:

我想知道我的程序是否可以产生竞态条件?如果是这样,请给我一个例子,因为我看不到任何人。

#define STRING_SIZE 1024
char *string; 
int main(int argc,char**argv){
 int length; 
 if(argc != 2) return ;
 length = strlen(string);
 strncpy(string+length,argv[1],STRING_SIZE,STRING_SIZE-length);
return 0;

}

如果我做一个锁怎么办?这是否纠正了问题?

#define STRING_SIZE 1024
int lock;
char *string; 
int main(int argc,char**argv){
 int length; 
 while(lock != 0){}
 lock = 1;
 if(argc != 2) return ;
 length = strlen(string);
 strncpy(string+length,argv[1],STRING_SIZE,STRING_SIZE-length);
 lock = 0;
 return 0;
}

【问题讨论】:

  • 对于竞争条件,您必须有 2 个线程或进程同时访问 1 个对象,并且其中至少有一个想要更改该对象。你能指定你的进程或线程是什么,你的对象是什么?
  • int变量名lock,并不能使它成为真正的锁
  • 全局变量不在“共享内存”中。
  • 为了在两个进程之间共享内存,你必须在linux中使用像shm_open()这样的函数。
  • @spleeftroner 不,永远不会有。请参阅this 了解详情。

标签: c race-condition


【解决方案1】:

如果一个进程中有多个执行线程并且它们都倾向于(有权访问)操作(读取/更改)共享变量,则会出现竞争条件。

在您的情况下,只有线程在执行 - main 尽管 char *string 被声明为全局。因此没有竞争条件。

要查看操作中的竞争条件,请使用 pthread 创建线程。在线程函数中随机访问/更改共享变量(示例中的 `char* 字符串)。在执行期间打印值。你会看到效果。

注意:在您的示例中,没有为char *string 分配内存。对此执行strlen 是不正确的。

【讨论】:

  • 我明白了,如果我用两个线程运行该程序会怎样?
猜你喜欢
  • 1970-01-01
  • 2019-05-03
  • 2012-04-17
  • 2019-08-20
  • 1970-01-01
  • 2023-03-13
  • 2022-01-23
  • 2018-10-08
  • 1970-01-01
相关资源
最近更新 更多