我有一个具有此代码的 pthread 函数,
每个线程从数据库访问 1000 行(每个线程不同)(每个线程都有一个指针MYSQL_RES
类型,在指向整个结果集的线程函数中声明为局部变量),寻找所需的行并执行mysql_fetch_row
1000 行(每个线程必须获取已定义的行子集)或直到它返回NULL
(以先到者为准))。
变量列表。(全球的)
MYSQL* connect = NULL;
MYSQL_RES* res = NULL;
std::fstream f;
pthread_mutex_t dBMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t fMutex = PTHREAD_MUTEX_INITIALIZER;
线程函数的局部变量列表,
MYSQL_ROW row = NULL;
MYSQL_RES* res = ::res; // local pointer to global result set
int count = eachThread; // where #define eachThread 1000
char c[50];
线程函数中的部分代码,
pthread_mutex_lock(&dBMutex);
mysql_data_seek(res,((arg)));
while(count && ((row = mysql_fetch_row(res))!=NULL))
{
strcpy(c,row[0]);
//pthread_mutex_unlock(&dBMutex); ///-------------------->
pthread_mutex_lock(&fMutex);
f<<c<<std::endl;
pthread_mutex_unlock(&fMutex);
count--;
//pthread_mutex_lock(&dBMutex); ///-------------------->
}
pthread_mutex_unlock(&dBMutex);
如果我注释两个解锁(///-------------------->
由 while
(数据库有 11112 行,它在文件中写入 11112 行)。
如果我不这样做,即我mysql_row_fetch
解锁锁,允许其他线程获取它。文件中写入的行数更多(达到 12000 )。
为什么会这样?循环是使用局部变量控制的while
,因此不可能存在竞争。怎么可能没有。文件中的行数是否超过循环可能执行的次数?(我在文件上使用了互斥锁,所以只有一个线程可以访问它。如果不能,它会阻塞互斥锁)
或者,如果我将文件访问代码包装在互斥锁dBMutex
中,则代码可以正常工作。
pthread_mutex_lock(&dBMutex);
//pthread_mutex_lock(&fMutex);
f<<c<<std::endl;
//pthread_mutex_unlock(&fMutex);
pthread_mutex_unlock(&dBMutex);