日期:2014-05-16  浏览次数:20657 次

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


int gCount = 0;

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

virtual ~CCount()
{
   gCount--;
}

};

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

}


------解决方案--------------------
加互斥

/**
 * @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;
}