所以我正在研究一个简单的程序来计算多个文本文件的投票数(每个文件的每一行包含一个候选人的名字,代表一票)。
我主要使用它,还有一个问题:每个候选人的总票数对于给定的候选人来说是不准确的,除非该候选人在每个中具有完全相同的投票数 {{1文件。订单没有什么区别。
例如:如果votes.txt
是目标目录中唯一的文件,并且每个候选人都有1票:
votes1.txt
每次运行程序时,程序产生的最终记录将正确地为每个计数器投票一次。
同样,如果目标目录有votes1.txt:
Clinton
Cruz
Kasich
Sanders
Trump
和votes1.txt
,并且每个候选人对每个候选人都有1票(按任意顺序),则最终记录将正确地分别为2票。
然而,一旦文本文件开始为候选人开出不同数量的选票,我就会在最终统计数据中开始得到不正确和不一致的总数。
EG:如果votes2.txt
和votes1.txt
的内容如下:
votes2.txt
对于克林顿而言,最终的结果将是不正确的(在这种情况下,它仍将是2而不是3)。但如果这两个文件对克林顿都有2票,那么最终的结果将再次正确,克林顿共有4票,其余为2票。最终的总数只会越远越远,votes1.txt:
Clinton
Cruz
Kasich
Sanders
Trump
votes2.txt:
Clinton
Cruz
Kasich
Clinton
Sanders
Trump
文件越大,越不相同。
这是一个非常奇怪和具体的错误,但梳理我的代码我只能找出导致它的原因。
以下是相关代码:
votes.txt
答案 0 :(得分:3)
这是一个问题:
args = voteTallyFiles[index];
argp = &args;
pthread_create(&*iter, NULL, &countVotes, argp);
在上面的行中,您将argp
传递给线程,但它们都指向完全相同的局部变量args
,这意味着所有线程都可能使用相同的数据。
使用address-of运算符传递指向voteTallyFiles[index]
的指针:
pthread_create(&*iter, NULL, &countVotes, &voteTallyFiles[index]);