0

在我的main()函数中,我调用pthread_create创建一个新线程。我将文本文件的名称传递给它,线程打开文本文件,计算行数,然后将该数字返回到main()我将整数设置totalCount +=为返回的数字的位置。

我知道线程函数可以正常工作,因为我用另一段代码计算了文本文件中的行数。当我使用循环pthread_create多次调用时会出现问题。totalCount我从计算一个文件中得到的结果是准确的,但是当我打开两个或更多文件时,输入是totalCount错误main()的。

我的程序可能出了什么问题导致这种情况?我的线程函数有问题吗?我的pthread_join?我知道这个问题在没有代码的情况下可能会很模棱两可,但是给出这个描述有什么想法吗?

4

2 回答 2

0

无代码都是猜测。但肯定totalCount +=不是线程安全的。您需要一个原子联锁操作(例如__sync_fetch_and_add),或者您需要使用互斥锁来保护它。

于 2012-10-21T07:15:40.490 回答
0

为了乐趣而在黑暗中拍摄——我能看到这个错误发生的唯一方法是如果内部行计数器——不是totalCount,而是跟踪每个文件中的行数——是一个全局的多变的。每个 pthread 都可能调用相同的行计数函数,因此当其他线程更新时,每个文件的行计数将不正确地增加。所以我会预测它totalCount总是大于而不是小于实际的行数。

于 2012-10-22T01:35:28.937 回答