线程同步

原子操作

 

互斥mutex相互排斥的意思,它是一种锁或者信号灯。

互斥用来保护多个线程共享的数据和结构,不会被同时修改,一个互斥锁只能有两种状态:

locked 枷锁

unlocked 解锁

加锁后互斥不让其他线程访问。

任何时刻只能有一个线程来掌握某个互斥上锁。

一个线程如果试图在一个已经加锁的互斥上再加锁,这个线程会被挂起,知道加锁的线程释放掉

互斥锁为止。

 

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

int pthread_mutex_lock(pthread_mutex_t *mutex);//加锁

int pthread_mutex_unlock(pthread_mutex_t *mutex);//解锁

PTHREAD_MUTEX_INITIALIZER是初始化一个加锁的宏定义。

 

////////////////////////////////////////////////////////////////////////////////////////////////////


//最恰当的互斥用法
/*
============================================================================
Name : thread.c
Author : zhujy
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//初始化了一个MUTEX锁

int count = 0;

void *func1(void *arg)
{

int *a = (int *) arg;
printf("thread%d start\n", *a);
int i;
for (i = 0; i < 10; i++)
{
printf("thread%d is running\n", *a);
sleep(1);
pthread_mutex_lock(&mutex);//给mutex加锁,这是一条原子操作,不可能出现两个线程同时执行这个代码
count++;//这段代码受到保护,永远只有一个线程可以操作
pthread_mutex_unlock(&mutex);//给mutex解锁
}
printf("thread%d end\n", *a);

pthread_exit(NULL);
}

int main(int arg, char * args[])
{
printf("process start\n");
pthread_t thr_d1, thr_d2;
int i[2];
i[0] = 1;
i[1] = 2;


pthread_create(&thr_d1, NULL, func1, &i[0]);
pthread_create(&thr_d2, NULL, func1, &i[1]);
pthread_join(thr_d1, NULL);
pthread_join(thr_d2, NULL);

printf("process end\n");
return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////////

 

/互斥锁的例子

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//初始化了一个MUTEX锁

void *func1(void *arg)
{
pthread_mutex_lock(&mutex);//给mutex加锁,这是一条原子操作,不可能出现两个线程同时执行这个代码  是一个队列结果锁几次就必须解锁几次。
int *a = (int *) arg;
printf("thread%d start\n", *a);
int i;
for (i = 0; i < 10; i++)
{
printf("thread%d is running\n", *a);
sleep(1);
}
printf("thread%d end\n", *a);
pthread_mutex_unlock(&mutex);//给mutex解锁
pthread_exit(NULL);
}

int main(int arg, char * args[])
{
printf("process start\n");
pthread_t thr_d1, thr_d2;
int i[2];
i[0] = 1;
i[1] = 2;


pthread_create(&thr_d1, NULL, func1, &i[0]);
pthread_create(&thr_d2, NULL, func1, &i[1]);
pthread_join(thr_d1, NULL);
pthread_join(thr_d2, NULL);

printf("process end\n");
return 0;
}

posted on 2015-03-27 22:35  后进后退  阅读(133)  评论(0编辑  收藏  举报