
报这个错误的原因是:pthread库不是linux默认的库,所以在编译时候需要指明libpthread.a库。
解决方法:在编译时,加上-lpthread参数。
执行结果:

乍一看,结果是对的,加500次,减500次,最后结果为0。但是仔细看所有的输出,你会发现有异样的东西。

导致这个不和谐出现的原因是,两个线程可以对同一变量进行修改。假如线程1执行tmp=50+1后,被系统中断,此时线程2对num=50执行了减一操作,当线程1恢复,在执行num=tmp=51。而正确结果应为50。所以当多个线程对共享区域进行修改时,应该采用同步的方式。
五、线程同步线程同步的三种方式:
1、互斥量 互斥量用pthread_mutex_t数据类型来表示。
两种方式初始化,第一种:赋值为常量PTHREAD_MUTEX_INITIALIZER;第二种,当互斥量为动态分配是,使用pthread_mutex_init函数进行初始化,使用pthread_mutex_destroy函数销毁。
#include<pthread.h> int pthread_mutex_init (pthread_mutex_t *__mutex, __const pthread_mutexattr_t *__mutexattr); int pthread_mutex_destroy (pthread_mutex_t *__mutex);
返回值:成功-0,失败-错误编号 加解锁加锁调用pthread_mutex_lock,解锁调用pthread_mutex_unlock。
#include<pthread.h> int pthread_mutex_lock (pthread_mutex_t *__mutex); int pthread_mutex_unlock (pthread_mutex_t *__mutex);
使用互斥量修改上一个程序(修改部分用红色标出):
pthread_mutex_t mylock=PTHREAD_MUTEX_INITIALIZER;
void *add(void *arg) {
int i = 0,tmp;
for (; i <500; i++)
{
pthread_mutex_lock(&mylock);
tmp=num+1;
num=tmp;
printf("+1,result is:%dn",num);
pthread_mutex_unlock(&mylock);
}
return ((void *)0);
}
void *sub(void *arg)
{
int i=0,tmp;
for(;i<500;i++)
{
pthread_mutex_lock(&mylock);
tmp=num-1;
num=tmp;
printf("-1,result is:%dn",num);
pthread_mutex_unlock(&mylock);
}
return ((void *)0);
}
2、读写锁 允许多个线程同时读,只能有一个线程同时写。适用于读的次数远大于写的情况。 读写锁初始化:
#include<pthread.h> int pthread_rwlock_init (pthread_rwlock_t *__restrict __rwlock, __const pthread_rwlockattr_t *__restrict __attr); int pthread_rwlock_destroy (pthread_rwlock_t *__rwlock);
返回值:成功--0,失败-错误编号
加锁,这里分为读加锁和写加锁。
读加锁:
int pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock)








