不一致的Tally使用向量和pthreads

时间:2016-04-28 04:00:59

标签: c++ pthreads

所以我正在研究一个简单的程序来计算多个文本文件的投票数(每个文件的每一行包含一个候选人的名字,代表一票)。

我主要使用它,还有一个问题:每个候选人的总票数对于给定的候选人来说是不准确的,除非该候选人在每个中具有完全相同的投票数 {{1文件。订单没有什么区别。

例如:如果votes.txt是目标目录中唯一的文件,并且每个候选人都有1票:

votes1.txt

每次运行程序时,程序产生的最终记录将正确地为每个计数器投票一次。

同样,如果目标目录有votes1.txt: Clinton Cruz Kasich Sanders Trump votes1.txt,并且每个候选人对每个候选人都有1票(按任意顺序),则最终记录将正确地分别为2票。

然而,一旦文本文件开始为候选人开出不同数量的选票,我就会在最终统计数据中开始得到不正确和不一致的总数。

EG:如果votes2.txtvotes1.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

1 个答案:

答案 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]);