互斥
临界资源
一次只允许一个任务(进程,线程)访问的共享资源
临界区
访问临界资源的代码
互斥机制
mutex互斥锁
任务访问临界资源前申请锁 访问完后释放锁
互斥锁初始化
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr *attr)
成功返回0 失败返回错误码
mutex指向要初始化的互斥锁对象
attr 互斥锁属性 NULl表示缺省属性
上锁
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex)
成功返回0 失败返回错误码
mutex指向要初始化的互斥对象
如果无法获得锁 任务阻塞
解锁
#include <pthread.h>
int phread_mutex_unlock(pthread_mutex_t *mutex)
成功返回0 失败返回错误码
mutex指向要初始化的互斥对象
执行完临界区要及时释放锁
#include <uistd.h>
和sleep大致相同 不过它的单位是微秒
Ps:
unsigned int count, value1,, value2;
pthread_mutex_t lock
void *function(void *arg);
int main(void)
{
pthread_t a_thread;
if(pthread_mutex_init(&lock, NULL) != 0)
{
printf("fail to pthread_mutex_init\n");
exit(-1);
}
if(pthread_create(&a_thread, NULL, function, NULL) !=0 )
{
printf("fail to pthread_create");
exit(-1);
}
while(1)
{
count++;
#ifder _LOCK_
pthread_mutex_lock(&lock);
#endif
value1 = count;
value2 = count;
#ifder _LOCK_
pthread_mutex_unlock(&lock);
#endif
return 0;
}
}
void *function(void *arg)
{
while(1)
{
#ifder _LOCK_
pthread_mutex_lock(&lock)
#endif
if(value1 != value2)
{
printf("value1 = %u, value2 = %u\n", value1, value2);
usleep(100000);
}
#ifdef _LOCK_
pthread_mutex_unlock(&lock);
#endif
}
return NULL;
}
}