1

我有一个具有此代码的 pthread 函数,

每个线程从数据库访问 1000 行(每个线程不同)(每个线程都有一个指针MYSQL_RES类型,在指向整个结果集的线程函数中声明为局部变量),寻找所需的行并执行mysql_fetch_row1000 行(每个线程必须获取已定义的行子集)或直到它返回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); 
4

0 回答 0