先上代码
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include "iostream"
#include <pthread.h>
using namespace std;
int a = 0;
pthread_mutex_t _mutex;
void pubFunc()
{
pthread_mutex_lock(&_mutex);
a = 0;
a++;
for(int i = 0; i < 50000 ; i++)
{
a++;
}
if(a != 50001)
{
cout << "a = " << a <<endl;
}
//cout << "threadID=" << pthread_self() << ", a = " << a << endl;
pthread_mutex_unlock(&_mutex);
}
void* proThread(void *arg)
{
while(1)
{
pubFunc();
//usleep(10);
}
}
int main()
{
pthread_mutex_init(&_mutex, NULL);
//thread id
pthread_t id;
cout << "main thread id is " << pthread_self() << endl;
if (!pthread_create(&id, NULL, proThread, NULL))
{
cout << "Create thread success!" << endl;
}
else
{
cout << "Create thread failed!" << endl;
}
//thread id2
pthread_t id2;
if (!pthread_create(&id2, NULL, proThread, NULL))
{
cout << "Create thread success!" << endl;
}
else
{
cout << "Create thread failed!" << endl;
}
pthread_t pid[50];
for(int i = 0; i< 50; i++)
{
if (!pthread_create(&pid[i], NULL, proThread, NULL))
{
cout << "Create thread success!,id = " << i << endl;
}
else
{
cout << "Create thread failed!" << endl;
}
}
pthread_join(id, NULL);
<pre name="code" class="cpp"><span style="white-space:pre"> </span>pthread_mutex_destory(&_mutex);
return 0; }
上面的例子里面有52个线程都在调用 pubFunc();
上述代码输出结果都将是:50001
操作1:
1.将int a = 0;的声明放在pubFunc里面;
2.不使用锁。
结果: 依然都是 50001
操作2:
1. int a = 0;依然保留放在全局区。
2. 不使用锁。
结果: 错乱的,输出各种数据。 35624,45963.。。。等等
以上例子说明
操作1说明: 函数的执行是在独立的空间里进行的。 多个线程调用同一个函数时,函数中的局部变量不会受到影响而导致不同步。(欢迎指出错误)
操作2说明:pobFunc函数体之外的数据,在多线程调用下将会出现不同步。
原代码说明:加互斥锁将解决操作2带来的问题。
补充;
互斥锁初始化的时,pthread_mutex_init(&_mutex, NULL); 第二个参数是用来设置锁的属性的。
1.函数原型:
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
该函数用于C函数的多线程编程中,互斥锁的初始化。
pthread_mutex_init()函数是以动态方式创建互斥锁的,参数attr指定了新建互斥锁的属性。如果参数attr为NULL,则使用默认的互斥锁属性,默认属性为快速互斥锁 。互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。
pthread_mutexattr_init()函数成功完成之后会返回零,其他任何返回值都表示出现了错误。
函数成功执行后,互斥锁被初始化为锁住态。
2. 互斥锁属性
互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。当前(glibc2.2.3,linuxthreads0.9)有四个值可供选择:
* PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。
* PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。
* PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。
* PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。
最后
以上就是缥缈战斗机最近收集整理的关于互斥锁的使用的全部内容,更多相关互斥锁内容请搜索靠谱客的其他文章。
发表评论 取消回复