#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_THREAD 100 // 线程数
pthread_mutex_t mutex; // 互斥量
void* thread_increase(void* arg); // 加
void* thread_reduce(void* arg); // 减
long long sum = 0; // 计算结果
int main(int argc, const char * argv[])
{
// 互斥锁的作用:防止多个线程同时访问
/*
* 创建互斥锁
* 函数名: pthread_mutex_init
* 参数: mutex:
* 创建互斥锁时保存互斥锁的变量地址值,销毁时需要传递的互斥锁变量地址值
* attr:
* 即将创建互斥锁的属性,无特别需要制定属性为NULL
* 返回值: 0成功,非0不成功
*/
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
/* 销毁互斥锁
* 函数名: pthread_mutex_destroy
* 参数: mutex(需要销毁的互斥锁变量的地址值)
* 返回值: 0成功,非0不成功
*/
int pthread_mutex_destroy(pthread_mutex_t * mutex);
/*
* 使当前线程处于阻塞状态
* 函数名: pthread_mutex_lock
* 参数: mutex(需要阻塞状态的互斥锁)
* 返回值: 0成功,非0不成功
*/
int pthread_mutex_lock(pthread_mutex_t * mutex);
/*
* 接触线程阻塞状态
* 函数名:pthread_mutex_unlock
* 参数:mutex(需要解除阻塞状态的互斥锁)
* 返回值:0成功,非0不成功
*/
int pthread_mutex_unlock(pthread_mutex_t * mutex);
// 例子
pthread_t t_id[NUM_THREAD];
pthread_mutex_init(&mutex, NULL);
for (int index = 0; index < NUM_THREAD; ++index)
{
if (index % 2)
{
pthread_create(&(t_id[index]), NULL, thread_increase, NULL);
}
else
{
pthread_create(&(t_id[index]), NULL, thread_reduce, NULL);
}
}
for (int index = 0; index < NUM_THREAD; ++index)
{
pthread_join(t_id[index], NULL);
}
pthread_mutex_destroy(&mutex);
printf("sum = %lld\n",sum);
return 0;
}
void* thread_increase(void* arg)
{
// 加锁互斥量,只有当前线程可以访问sum变量
pthread_mutex_lock(&mutex);
for (int index = 0; index < 100000; ++index)
{
sum += index;
}
// 解锁互斥量,其他线程可以访问sum变量
pthread_mutex_unlock(&mutex);
return NULL;
}
void* thread_reduce(void* arg)
{
// 加锁互斥量,只有当前线程可以访问sum变量
pthread_mutex_lock(&mutex);
for (int index = 0; index < 100000; ++index)
{
sum -= index;
}
// 解锁互斥量,其他线程可以访问sum变量
pthread_mutex_unlock(&mutex);
return NULL;
}
线程同步(互斥量)
最新推荐文章于 2019-08-14 23:13:12 发布