线程锁

一个进程中有很多线程,而这些线程是共享静态数据,进程中打开的文件描述符,当前工作目录,以及用户I/D。

CPU程序运行线程是按时间片来给线程使用时间的,这个时候问题来了。

如果不同线程同时操作一个共享资源里的数据,那么线程A往共享数据里写东西写到一半时间片时间到了,

线程B开始操作共享数据,这个时候那个数据,很明显是不良数据,A都还没有写完呢。所以这样会造成数据的混乱。

因此我们就需要线程A操作共享数据时线程B不能参与,但时间片是系统发放的我们不能控制。

而且我们要做的只是在A操作数据时,B不能操作而已,所以只要加个东西,让A操作时B不能操作,这东西就是线程锁。

在操作共享资源数据时,线程都会把线程锁挂上,以免其他的线程也来操作这个资源。

下面是几个线程锁的函数。

互斥锁初始化:pthread_mutex_init()

互斥锁上锁:pthread_mutex_lock()

互斥锁解锁:pthread_mutex_unlock()

互斥锁上锁(非阻塞):pthread_mutex_trylock()

消除互斥锁:pthread_mutex_destroy()

//

int  pthread_mutex_init(pthread_mutex_t  *mutex, pthread_mutexattr_t *attr)  

创建一个线程锁

attr为锁的属性,不想管他的话就把它设置为NULL

///

int  pthread_mutex_destroy(pthread_mutext_t *__mutes)

消灭一个线程锁

/

int  pthread_mutex_lock(pthread_mutex_t *mutex)   

上锁

/

int  pthread_mutex_unlock(pthread_mutex_t *mutex)   

解锁

///

测试代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

int oldvalue1;
pthread_mutex_t  mutex;
unsigned int count = 0;
void *function(void *arg);

int main(int argc,  char *argv[])
{
        pthread_t  a_thread;
     void *thread_result;
	 if (pthread_create(&a_thread, NULL, function, NULL) < 0)
   {
       perror("fail to pthread_create");
       exit(-1);
   }
   if (pthread_mutex_init(&mutex, NULL) < 0)
   {
       perror("fail to mutex_init");
       exit(-1);
   }

    while ( 1 )
    {
      pthread_mutex_lock(&mutex);
      oldvalue1 = count;
      count++;
      printf("count is %d \n",count);
      sleep(2);
      pthread_mutex_unlock(&mutex);
	   sleep(2);
   }
    return 0;
 }
void  *function(void *arg)
{
     while ( 1 )
     {
       pthread_mutex_lock(&mutex);
       if (oldvalue1 != count)
          {
            printf("count=%d ,oldvalue1=%d\n",count,oldvalue1);
          }
        else
           printf("count isnot change\n");
       pthread_mutex_unlock(&mutex);
        sleep(1);
 }
     return NULL;
 }



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值