中山市交通建设发展集团网站,杭州pc网站开发公司有哪些,免费企业信息查询,公众号开发者id在哪找1.互斥量 a#xff09;互斥量#xff08;mutex#xff09;从本质上来说是一把锁#xff0c;一般在主线程中定义一个互斥量#xff0c;就是定义一把锁。然后根据我们的需求来对线程操作这把锁。
b#xff09;如果给所有的线程都加上锁了#xff0c;线程们会去争取内存空…1.互斥量 a互斥量mutex从本质上来说是一把锁一般在主线程中定义一个互斥量就是定义一把锁。然后根据我们的需求来对线程操作这把锁。
b如果给所有的线程都加上锁了线程们会去争取内存空间谁先争取到谁先运行直到该线程解锁后期间其他线程只能等待阻塞。
c因为主线程不上锁在先拿到锁的线程在跑的过程中主线程也会跟着跑。 include pthread.h // 返回若成功返回0否则返回错误编号 int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);创建锁 int pthread_mutex_lock(pthread_mutex_t *mutex);//加锁 int pthread_mutex_unlock(pthread_mutex_t *mutex);//解锁 int pthread_mutex_destroy(pthread_mutex_t *mutex);//销毁锁 互斥量用pthread_mutex_t数据类型表示。在使用互斥量前必须对它进行初始化可以通过调用pthread_mutex_init函数进行初始化。如果动态地分配互斥量例如通过调用malloc函数那么在释放内存前需要调用 pthread_mutex_destroy. 要用默认的属性初始化互斥量只需要把attr设置为NULL。 锁如果线程不希望被阻塞它可以使用pthread_mutex_trylock尝试对互斥量进行加锁。如果调用pthread_mutex_trylock时互斥量处于未锁住状态那么pthread_mutex_trylock将锁住互斥量不会出现阻塞并返回0否则pthread_mutex_trylock就会失败不能锁住互斥量而返回EBUSY。
2.加锁解锁简单操作
代码
#includestdio.h
#includepthread.h
#include unistd.hint data 0;//定义一个全局变量data
pthread_mutex_t mutex;//创建一把锁
void *func1(void *arg)
{int i;pthread_mutex_lock(mutex);//加锁for(i0;i5;i){printf(t1:thread id is:%ld\n,(unsigned long)pthread_self());printf(t1:is param:%d\n,*((int *)arg));sleep(1);}pthread_mutex_unlock(mutex);//解锁
}
void *func2(void *arg)
{pthread_mutex_lock(mutex);//加锁printf(t2:thread id is:%ld\n,(unsigned long)pthread_self());printf(t2:is param:%d\n,*((int *)arg));pthread_mutex_unlock(mutex);//解锁}
void *func3(void *arg)
{pthread_mutex_lock(mutex);//加锁printf(t3:thread id is:%ld\n,(unsigned long)pthread_self());printf(t3:is param:%d\n,*((int *)arg));pthread_mutex_unlock(mutex);//解锁}
int main()
{int ret;int param 100;pthread_t t1;pthread_t t2;pthread_t t3;pthread_mutex_init(mutex,NULL);//初始化锁ret pthread_create(t1,NULL,func1,(void *)param);//创建线程t1if(ret 0){printf(main:创建线程t1成功!\n);}ret pthread_create(t2,NULL,func2,(void *)param);//创建线程t2if(ret 0){printf(main:创建线程t2成功!\n);}ret pthread_create(t3,NULL,func3,(void *)param);//创建线程t3if(ret 0){printf(main:创建线程t3成功!\n);}printf(main:获取主程序的ID:%ld\n,(unsigned long)pthread_self());pthread_join(t1,NULL);pthread_join(t2,NULL);pthread_join(t3,NULL);return 0;
}
结果: 先拿到锁的是t1线程先运行但是会和主线程争抢内存因为主线程没加锁虽然会被打断但是对于其他t2t3线程他们只有等待阻塞等t1先运行完 3.互斥锁限制共享内存的访问
#includestdio.h
#includepthread.h
#include unistd.h
#includestdlib.h
int data 0;//定义一个全局变量data
pthread_mutex_t mutex;void *func1(void *arg)
{pthread_mutex_lock(mutex);while(1){printf(线程t1拿到 data %d\n,data);sleep(1);if(data 5){printf(t1:data %d\n,data);pthread_mutex_unlock(mutex);printf(t1线程退出\n);exit(0);}}}
void *func2(void *arg)
{while(1){printf(线程t2拿到 data %d\n,data);pthread_mutex_lock(mutex);data;pthread_mutex_unlock(mutex);sleep(1);}
}
int main()
{int ret;int param 100;pthread_t t1;pthread_t t2;pthread_mutex_init(mutex,NULL);ret pthread_create(t1,NULL,func1,(void *)param);//创建线程t1if(ret 0){printf(main:创建线程t1成功!\n);}ret pthread_create(t2,NULL,func2,(void *)param);//创建线程t2if(ret 0){printf(main:创建线程t2成功!\n);}printf(主线程main拿到data:%d\n,data);pthread_join(t1,NULL);pthread_join(t2,NULL);pthread_mutex_destroy(mutex);return 0;
}
结果 t2解锁后t1一直拿锁知道循环结束整个程序退出因为是共享内存。
4.死锁
前提条件是定义了两把锁其中一个线程拿到了第一把锁和第二把锁另外的一个线程拿到了第二把锁和第一把锁然后他们都在争用锁的使用权因为都解他们各自拥有的第一把所所以一直卡在争用锁锁的使用权。
代码
#include stdio.h
#include pthread.h//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
pthread_mutex_t mutex;
pthread_mutex_t mutex2;int g_data0;void *func1(void *arg)
{int i;pthread_mutex_lock(mutex);sleep(1);pthread_mutex_lock(mutex2);for(i0;i5;i){printf(t1:%ld thread is create\n,(unsigned long)pthread_self());printf(t1:param is %d\n,*((int*)arg));sleep(1);}pthread_mutex_unlock(mutex);
}
void *func2(void *arg)
{pthread_mutex_lock(mutex2);sleep(1);pthread_mutex_lock(mutex);printf(t2:%ld thread is create\n,(unsigned long)pthread_self());printf(t2:param is %d\n,*((int*)arg));pthread_mutex_unlock(mutex);}int main()
{int ret;int param100;pthread_t t1;pthread_t t2;pthread_mutex_init(mutex,NULL);pthread_mutex_init(mutex2,NULL);retpthread_create(t1,NULL,func1,(void*)param); if(ret0){printf(main:create t1 success\n);}retpthread_create(t2,NULL,func2,(void*)param);if(ret0){printf(main:create t2 success\n);}printf(main %ld \n,(unsigned long)pthread_self());pthread_join(t1,NULL);pthread_join(t2,NULL);pthread_mutex_destroy(mutex);pthread_mutex_destroy(mutex2);return 0;
}
结果
main:create t1 success
main:create t2 success
main 139666438145792
^C
CLCEmbed_Learn:~/thread$ ./a.out
main:create t1 success
main:create t2 success
main 139839917381376
^C
CLCEmbed_Learn:~/thread$ ./a.out
main:create t1 success
main:create t2 success
main 139912974800640
^C
CLCEmbed_Learn:~/thread$
只有1把锁的情况下是不会造成死锁的
在这里func1拿着锁mutex需要拿锁mutex2func2拿着锁mutex2需要拿锁mutex从而造成了死锁。