J2C_synchronized_2_mutex_比较

/************************************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:学习笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值