多线程中锁的实现

来源:互联网 发布:linux 清空日志 编辑:程序博客网 时间:2024/04/29 16:17

转自:http://blog.csdn.net/wtz1985/article/details/3015376

所谓"锁",就是为了让自己独自占有空间,在自己没用完之前,不让别人来占用自己的资源.现在的操作系统,无论是WINDOWS,还是UNIX等其他操作系统.都采用多线程的环境.这极大提高了任务的执行速度,而且不会影响其他事务的执行.但是它们的执行是靠时间片的轮转的,如果某一个线程没有执行完,可它的时间片用完了,就会被挂起来,直到轮到它的下个时间片.假如继续让它们这么自由的,没有约束的执行命令,将会导致一种不可预见的结果,可该怎么解决呢?请看下面:

锁的引出,就是为了某一个线程在操作某一件事务时,独自占有其资源,并把自己琐起来,在自己没有把锁解开之前,别人只能等,不能抢,这就有效地控制了线程们不会因为时间片的作祟,而导致出现不可想象的结果.下面用代码简述一下锁是怎么实现的:

1、定义锁的接口。

  1. /*----- locker.h -------*/
  2. #ifndef _LOCKER_H
  3. #define _LOCKER_H
  4. struct _Locker;
  5. typedef struct _Locker Locker;
  6. typedef int (*LockerLockFunc)(Locker* thiz);
  7. typedef int (*LockerUnlockFunc)(Locker* thiz);
  8. typedef void (*LockerDestroyFunc)(Locker* thiz);
  9. struct _Locker
  10. {
  11.  LockerLockFunc lock;
  12.  LockerUnlockFunc unlock;
  13.  LockerDestroyFunc locker_destroy;
  14.  char priv[0];
  15. };
  16. static inline int locker_lock(Locker* thiz)
  17. {
  18.  assert(thiz != NULL && thiz->lock != NULL);
  19.  return thiz->lock;
  20. }
  21. static inline int locker_unlock(Locker* thiz)
  22. {
  23.  assert(thiz != NULL && thiz->unlock != NULL);
  24.  return thiz->unlock;
  25. }
  26. static inline void locker_destroy(Locker* thiz)
  27. {
  28.  assert(thiz != NULL && thiz->locker_destroy != NULL);
  29.  return thiz->destroy_locker;
  30. }
  31. #endif  /*_LOCKER_H*/

2、定义线程锁的接口。

  1. /*------ pthread_locker.h --------*/
  2. #ifndef _PTHREAD_LOCKER_H
  3. #define _PTHREAD_LOCKER_H
  4. #include "locker.h"
  5. Locker* locker_create(const char* name);
  6. #endif /*_PTHREAD_LOCKER_H*/

3、接口的实现。

  1. /*----- pthread_locker.c ------*/
  2. #include "pthread_locker.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <assert.h>
  7. typedef struct _PrivInfo
  8. {
  9.  char* str_name;
  10.  pthread_mutex_t mutex;
  11. }PrivInfo;
  12. static pthread_locker_lock(Locker* thiz)
  13. {
  14.  assert(thiz != NULL);
  15.  PrivInfo* priv = (PrivInfo*)thiz->priv;
  16.  return pthread_mutex_lock(&(priv->mutex));
  17. }
  18. static pthread_locker_unlock(Locker* thiz)
  19. {
  20.  assert(thiz != NULL);
  21.  PrivInfo* priv = (PrivInfo*)thiz->priv;
  22.  return pthread_mutex_unlock(&(priv->mutex));
  23. }
  24. static pthread_locker_destroy(Locker* thiz)
  25. {
  26.  assert(thiz != NULL);
  27.  PrivInfo* priv = (PrivInfo*)thiz->priv;
  28.  free(priv->str);
  29.  pthread_mutex_destroy(&(priv->mutex));
  30.  free(thiz);
  31.  return;
  32. }
  33. Locker* locker_create(const char* name)
  34. {
  35.  Locker* thiz = (Locker*)malloc(sizeof(Locker)+sizeof(PrivInfo));
  36.  PrivInfo* priv = thiz->priv;
  37.  priv->str_name = strdup(name);
  38.  pthread_mutex_init(&(priv->mutex), NULL);
  39.  thiz->lock = pthread_locker_lock;
  40.  thiz->unlock = pthread_lokcer_unlock;
  41.  thiz->locker_destroy = pthread_locker_destroy;
  42.  return thiz;
  43. }

这就是线程锁的简单实现。可是当你在链表中插入时,要进行查找的操作,这时候只是简单的线程锁是不能解决的,那该怎么解决呢?这就涉及到递归锁的问题咯,下一篇再说递归琐的实现。