| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- /************************************************************************
- * AUTHOR: NiuJiuRu
- * FILENAME: sw_rwlock.c
- * DESCRIPTION: 读写锁, 也称共享锁
- * NOTE: 主要用于多线程同步访问全局共享资源
- * HISTORY:
- * 1, [2014-01-24] created by NiuJiuRu
- ***********************************************************************/
- #include "swapi.h"
- #include "swmem.h"
- #include "sw_rwlock.h"
- /* 创建读写锁 */
- void *sw_rwlock_create()
- {
- pthread_rwlock_t *rwlock = NULL;
- pthread_rwlockattr_t attr;
-
- rwlock = (pthread_rwlock_t *)sw_heap_malloc(sizeof(pthread_rwlock_t));
- if(rwlock)
- {
- memset(rwlock, 0, sizeof(pthread_rwlock_t));
- pthread_rwlockattr_init(&attr);
- // note: "If the process-shared attribute is PTHREAD_PRO-CESS_PRIVATE, the read-write lock shall only be
- // operated upon by threads created within the same process as the thread that initialized the read-write lock;
- // if threads of differing processes attempt to operate on such a read-write lock, the behavior is undefined."
- if(pthread_rwlockattr_setpshared(&attr, PTHREAD_PROCESS_PRIVATE) == 0) pthread_rwlock_init(rwlock, &attr);
- else{ sw_heap_free(rwlock); rwlock = NULL; }
- pthread_rwlockattr_destroy(&attr);
- }
-
- return rwlock;
- }
- /* 销毁读写锁 */
- void sw_rwlock_destroy(void *hRWLock)
- {
- pthread_rwlock_t *rwlock = (pthread_rwlock_t *)hRWLock;
- pthread_rwlock_destroy(rwlock);
- sw_heap_free(rwlock);
- }
- /* 读写锁上锁-读(超时设置的时间单位为: 毫秒, 并且当timeout = -1时表示无限等待) */
- int sw_rwlock_rdlock(void *hRWLock, int timeout)
- {
- pthread_rwlock_t *rwlock = (pthread_rwlock_t *)hRWLock;
- struct timespec ts = { 0 };
-
- if(timeout < 0)
- {
- return pthread_rwlock_rdlock(rwlock);
- }
- else
- {
- ts.tv_sec = time(NULL) + timeout/1000;
- ts.tv_nsec = (timeout%1000)*1000;
- if(pthread_rwlock_timedrdlock(rwlock, &ts) != 0) return -1;
- }
-
- return 0;
- }
- /* 读写锁上锁-写(超时设置的时间单位为: 毫秒, 并且当timeout = -1时表示无限等待) */
- int sw_rwlock_wrlock(void *hRWLock, int timeout)
- {
- pthread_rwlock_t *rwlock = (pthread_rwlock_t *)hRWLock;
- struct timespec ts = { 0 };
-
- if(timeout < 0)
- {
- return pthread_rwlock_wrlock(rwlock);
- }
- else
- {
- ts.tv_sec = time(NULL) + timeout/1000;
- ts.tv_nsec = (timeout%1000)*1000;
- if(pthread_rwlock_timedwrlock(rwlock, &ts) != 0) return -1;
- }
-
- return 0;
- }
- /* 读写锁解锁 */
- void sw_rwlock_unlock(void *hRWLock)
- {
- pthread_rwlock_t *rwlock = (pthread_rwlock_t *)hRWLock;
- pthread_rwlock_unlock(rwlock);
- }
|