/************************************Java******synchronized**********************/
public class MulThread_value implements Runnable{
private int count=10; //全局变量
public synchronized void run() { //保证run()方法代码块是原子操作
count--;
System.out.println(Thread.currentThread().getName()+"-->count:"+count);
}
public static void main(String[] args) {
MulThread_value mt=new MulThread_value();
for(int i=0;i<5;i++){
new Thread(mt, "Thread"+i).start();
}
}
}
/***********************************C*****互斥锁*******************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <pthread.h>
#define MAX 10000
int number; //全局变量
pthread_mutex_t mutex; //创建一把互斥锁
void* funcA_num(void* arg) //回调函数的实现,该函数属于子线程
{
int i=0;
for(i=0;i<MAX;++i)
{
pthread_mutex_lock(&mutex); //加锁,mutex被锁,代码阻塞在当前位置
int cur=number;
cur++;
number=cur;
printf("Thread A, id=%lu, number=%d\n",pthread_self(),number);
pthread_mutex_unlock(&mutex); //解锁
usleep(10); //睡10微秒
}
return NULL;
}
void* funcB_num(void* arg)
{
int i=0;
for(i=0;i<MAX;++i)
{
pthread_mutex_lock(&mutex); //加锁
int cur=number;
cur++;
number=cur;
printf("Thread B, id=%lu, number=%d\n",pthread_self(),number);
pthread_mutex_unlock(&mutex); //解锁
usleep(10); //睡10微秒
}
return NULL;
}
int main(int argc,const char* argv[]) //在main函数中的方法属于父线程
{
pthread_t p1,p2;
pthread_mutex_init(&mutex,NULL); //初始化互斥锁
pthread_create(&p1,NULL,funcA_num,NULL); //子进程创建出来以后,第一件事是去抢CPU
pthread_create(&p2,NULL,funcB_num,NULL);
pthread_join(p1,NULL); //阻塞,等待子线程死掉,资源回收
pthread_join(p2,NULL);
pthread_mutex_destroy(&mutex); //释放互斥锁资源
return 0;
}
互斥是通过竞争对资源的独占使用,彼此之间不需要知道对方的存在,执行顺序是一个乱序。
同步是协调多个相互关联线程合作完成任务,彼此之间知道对方存在,执行顺序往往是有序的。
Mark:学习笔记