问题描述
有一个初始值为n的全局变量作为计数器,
然后用n个线程,每个线程将计数器减1,将这个计数器减少到0;
在n比较大的时候, 得不到正确结果.
使用了pthread线程和std::thread,尝试了用pthread_mutex, std::mutex, 以及__atomic_sub_fetch进行加锁或者原子减,都得不到正确结果
当n为10的时候,可以得到正确结果.
当n为100的时候,得不到正确结果.而在线程内延时10ms之后可以得到正确结果
我猜是共享资源这里出了问题,但是实在想不通,这个锁应该怎么加才是对的... 求各位Dalao解答一下`
相关代码
全局变量
int count = 100;
pthread_mutex_t mutex_pthread;
mutex mutex_std;
线程函数
void* writer(void* id) {
cout << "Writer enter. " << (long)id << endl;
//this_thread::sleep_for(chrono::milliseconds(10));
//__atomic_sub_fetch(&count, 1, __ATOMIC_RELAXED);
//pthread_mutex_lock(&mutex_pthread);
//count--;
//pthread_mutex_unlock(&mutex_pthread);
{
lock_guard<mutex> lock_guard1(mutex_std);
count--;
}
cout << "Writer exit. " << (long)id << ", count: " << count << endl;
return NULL;
}
主函数
int main() {
std::cout << "Hello, World!" << std::endl;
pthread_mutex_init(&mutex_pthread, NULL);
vector<pthread_t> writers;
for (int i = 0; i < count; i++) {
pthread_t th;
pthread_create(&th, NULL, writer, (void*)i);
writers.push_back(th);
}
for (int i = 0; i < count; i++) {
void* ret;
pthread_join(writers[i], &ret);
}
cout.flush();
cerr << "All writers end. Count: " << count << endl;
while (count);
cerr << "All writers end. Count: " << count << endl;
return 0;
}
你期待的结果是什么?实际看到的错误信息又是什么?
期待stderr中count输出的count为0;
实际输出为49;
join的循环次数不对
`
count在线程中被改变了,所以部分线程没等到就退出了