线程锁

多线程对数据进行操作的时候,如果大家争着访问一个数据,运算结果就会出错,结果是不确定的。

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//创建一个线程锁。

为了得到一个确定的结果,需要对访问全局变量的这段代码进行加锁。代码示例如下:

for(i=0; i<=100000; i++) {

    /*加锁*/

     pthread_mutex_lock(&mutex);

    tmp = sharedi;

     tmp = tmp + 1;

     sharedi = tmp;

    /*解锁*/

    pthread_mutex_unlock(&mutex);

}

其中,被锁的代码是   tmp = sharedi; tmp = tmp + 1; sharedi = tmp;这三句。

锁的机制,就像是一个守门人,看住了这段代码,一次只放一个线程进入。

所以,pthread_mutex_lock(&mutex);这句加锁的代码,内部应该是一个循环等待的实现:能加锁的时候,加锁,继续执行下一句代码。不能加锁的时候,等待,直到加锁成功,再执行下一句命令。

所以,加锁会耗费程序运行时间,耗费cpu和内存,线程进入加锁的程序很有可能需要等待一段时间,才能进行下一步。

你可能感兴趣的:(线程锁)