一个进程中有很多线程,而这些线程是共享静态数据,进程中打开的文件描述符,当前工作目录,以及用户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;
}