c++ 全局对象 多线程共用_Linux下,多线程程序中对全局变量应当如何操作?

在Linux环境下,一个涉及全局计数器的多线程程序遇到了同步问题。当有多个线程同时尝试减小计数器时,即便使用了pthread_mutex、std::mutex和__atomic_sub_fetch等同步机制,在较大线程数量下仍无法得到正确的结果。当线程数量为10时运行正常,而当线程数量增加到100时,不加延迟的执行会导致计数器不正确。在加入10毫秒的延时后,结果变得正确。问题在于如何正确地对全局共享资源加锁以确保线程安全。
摘要由CSDN通过智能技术生成

问题描述

有一个初始值为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 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 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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值