linux多线程小程序

来源:百度知道 编辑:UC知道 时间:2024/05/31 15:37:27
刚接触linux的多线程编程,照着例子写了个小程序。
创建4个线程,2个线程往数组写整数,2个线程用数组里的数做加法、乘法,用信号量实现控制。
我的代码是:
#include<stdio.h>
#include<stdlib.h>
#include<semaphore.h>
#include<pthread.h>
sem_t s;
int data[2];

void write_data1(int *a)
{
data[0]=*a;
printf("write data1");
sem_post(&s);
}

void write_data2(int *b)
{
data[1]=*b;
printf("write data2");
sem_post(&s);
}

void operate_data1(void)
{
sem_wait(&s);
int product;
product=data[0]*data[1];
printf("乘法:%d*%d=%d\n",data[0],data[1],product);
}

void operate_data2(void)
{
sem_wait(&s);
int sum;
sum=data[0]+data[1];
printf("加法:%d+%d=%d\n",data[0],data[1],sum);
}

int main(void)
{
sem_init(&s,0,0);
pthread_t t1,t2,t3

首先声明我也不是高手,我和你一样,正在学习可以讨论、讨论,我说的只是自己的理解,不一定完全正确!

你使用信号量的作用是做同步的如果operate_data1或者 operate_data2线程先运行的话他们不会先去作运算的,不会出现你说的那种“当数没全写到数组里,就进行运算了”的情况,因为在他们运算之前调用了sem_wait(&s);首先要有信号资源可用才可以去运算,而现在只有3种情况可以获得信号资源:

1、初始化信号量的时候是正值,显然你的不是 sem_init(&s,0,0);
2、void write_data1(int *a)线程运行后;
3、void write_data1(int *a)线程运行后;

只有以上这三种情况的任意一种发生了,两个operate_data中的一个才可能获得资源而运行。要解决这种情况最简单的情况是把两个写数据操作放到一个线程中把两个操作数据放到一个线程中,这样就不会出现竞争的情况了。或是在把两个写数据操作放到一个线程中,在操作线程中,在操作前sem_wait(&s);在操作后调用sem_post(&s);