C/C++线程同步

声明:本博文用于学习总结及工作心得


1.线程同步与代码无关,只与mutex相关;不同mutex,多个线程之间不能同步互斥;


2.多线程的意义在于并发, 同步互斥的意义在于多个线程执行相同代码,不添加同步,不给mutex加锁(结束时要解锁),

代码执行的结果不确定,比如对静态变量进行操作


pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//初始化一个mutex锁, 这是一条原子操作,不可能出现两个线程同时执行这个代码
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;//初始化第二个mutex锁
//线程同步
void *func(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 tunning\n", *a);
		sleep(1);
	}
	printf("thread%d end\n", *a);
	pthread_mutex_unlock(&mutex);//给mutex解锁
	pthread_exit(NULL);
}

void *func2(void *arg)
{
	pthread_mutex_lock(&mutex2);//给mutex加锁
	int *a = (int *)arg;
	printf("thread %d start\n", *a);
	int i;
	for(i = 0; i < 10; i++)
	{
		printf("thread %d is tunning\n", *a);
		sleep(1);
	}
	printf("thread%d end\n", *a);
	pthread_mutex_unlock(&mutex2);//给mutex解锁
	pthread_exit(NULL);
}

int main(int arg, char * args[])
{
	printf("process start\n");
	pthread_t thrd, thrd2;
	int i[2];
	i[0] =1; i[1]=2;
	pthread_create(&thrd, NULL,func, &i[0]);
	pthread_create(&thrd2, NULL,func2, &i[1]);
	pthread_join(thrd, NULL);
	pthread_join(thrd2, NULL);
	printf("process end\n");
	return 0;
}
main 函数中创建了两个线程,两个线程执行的代码不一样,加的锁不一样,这样的线程操作并没有意义,初始化的第二个mutex也更本不能与其它线程同步互斥,因为不是相同的mutex;多个线程之间同步互斥与代码无关,只与mutex有关系;

注释func2 注释mutex2, 将pthread_create(&thrd2, NULL,func2, &i[1]); 改为pthread_create(&thrd2, NULL,func, &i[1]);
一旦mutex被某一个线程加锁后,其它线程再去执行加锁,该线程将会被阻塞,直到mutex被前一个线程解锁后,其它线程才能继续执行

线程thrd与thrd2在线程启动后就已经是同步互斥的关系;总的来说,linux下的线程同步机相对简单多了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值