pthread互斥的问题,谢谢

guolisen 2013-01-09 02:58:12
我使用了一个全局变量做计数,利用构造和析构函数在线程进入时加1,推出时减1,没有互斥。请问为什么我开1000多线程结束之后这个全局变量的值不是0,有时是负数,有时是1、2.。。


int gCount = 0;

class CCount
{
public:
CCount()
{
gCount++;
}

virtual ~CCount()
{
gCount--;
}

};

///////////////线程函数//////////
void* work_thread(void* arg)
{
CCount count;
.........

}

...全文
83 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
guolisen 2013-01-10
  • 打赏
  • 举报
回复
引用 4 楼 mymtom 的回复:
gCount++; 这个不是原子操作,不能一条指令完成 比如线程1从内存取到的数是8, 这时线程2也取到8, 然后线程1把9存到内存,线程2也把9存到内存。 引用 3 楼 guolisen 的回复:感觉虽然是全局变量,但就是计数,互斥有必要吗?就是不明白从哪里出现的问题
谢!
mymtom 2013-01-09
  • 打赏
  • 举报
回复
gCount++; 这个不是原子操作,不能一条指令完成 比如线程1从内存取到的数是8, 这时线程2也取到8, 然后线程1把9存到内存,线程2也把9存到内存。
引用 3 楼 guolisen 的回复:
感觉虽然是全局变量,但就是计数,互斥有必要吗?就是不明白从哪里出现的问题
guolisen 2013-01-09
  • 打赏
  • 举报
回复
感觉虽然是全局变量,但就是计数,互斥有必要吗?就是不明白从哪里出现的问题
guolisen 2013-01-09
  • 打赏
  • 举报
回复
引用 1 楼 mymtom 的回复:
加互斥 C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253/** * @file cntr.cpp * @brief */ #include <iostream>using namespace ……
我就是不明白,都是规规矩矩的加1减1,哪里会出现多加或者少加的情况呢?
mymtom 2013-01-09
  • 打赏
  • 举报
回复
加互斥

/**
 * @file    cntr.cpp
 * @brief   
 */

#include <iostream>
using namespace std;

#include <pthread.h>

int gCount = 0;
pthread_mutex_t gMutex = PTHREAD_MUTEX_INITIALIZER;

class CCount {
public:
    CCount()
    {
        pthread_mutex_lock(&gMutex);
        gCount++;
        pthread_mutex_unlock(&gMutex);
    }
    ~CCount()
    {
        pthread_mutex_lock(&gMutex);
        gCount--;
        pthread_mutex_unlock(&gMutex);
    }
};

void *work_thread(void *arg)
{
    CCount count;
    return NULL;
}

#define N   1000
int main(int argc, char *argv[])
{
    int i;
    pthread_t tid[N];

    for (i = 0; i < N; ++i) {
        pthread_create(&tid[i], NULL, work_thread, NULL);
    }


    for (i = 0; i < N; ++i)
        pthread_join(tid[i], NULL);

    printf("gCount=%d\n", gCount);

    return 0;
}

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧