编程语言应用

首页 » 常识 » 常识 » LinuxC语言高级编程之多线程使用实
TUhjnbcbe - 2021/8/14 19:54:00
得了白癜风能治好吗 https://m-mip.39.net/baidianfeng/mipso_4755379.html

多线程之线程同步实例

1、使用互斥量实现线程同步:

//使用互斥量实现线程同步

#includestdio.h

#includestdlib.h

#includeunistd.h

#includepthread.h

//定义指针数组作为共享资源

char*buf[5];

//记录数组的下标

intpos;

//定义互斥量

pthread_mutex_tmutex;

void*task(void*pv)

{

//使用互斥量进行加锁

pthread_mutex_lock(mutex);

//访问共享资源

buf[pos]=pv;

sleep(1);

pos++;

//使用互斥量进行解锁

pthread_mutex_unlock(mutex);

returnNULL;

}

intmain(void)

{

//初始化互斥量

pthread_mutex_init(mutex,NULL);

//启动子线程去访问共享资源

pthread_ttid;

pthread_create(tid,NULL,task,"hello");

pthread_ttid2;

pthread_create(tid2,NULL,task,"world");

//等待子线程结束

pthread_join(tid,NULL);

pthread_join(tid2,NULL);

//遍历共享资源中的数据

inti=0;

for(i=0;ipos;i++)

{

printf("%s",buf);

}

printf("\n");

//销毁互斥量

pthread_mutex_destroy(mutex);

return0;

}

2、使用信号量实现线程同步:

//使用信号量实现线程同步

#includestdio.h

#includestdlib.h

#includeunistd.h

#includepthread.h

#includesemaphore.h

//定义指针数组作为共享资源

char*buf[5];

//定义变量记录数组的下标

intpos;

//定义信号量

sem_tsem;

void*task(void*pv)

{

//获取信号量

sem_wait(sem);

//访问共享资源

buf[pos]=pv;

sleep(1);

pos++;

//释放信号量

sem_post(sem);

returnNULL;

}

intmain(void)

{

//初始化信号量

sem_init(sem,0,1/*初始值*/);

//启动子线程去访问共享资源

pthread_ttid;

pthread_create(tid,NULL,task,"hello");

pthread_ttid2;

pthread_create(tid2,NULL,task,"world");

//等待子线程结束

pthread_join(tid,NULL);

pthread_join(tid2,NULL);

//遍历共享资源中的数据

inti=0;

for(i=0;ipos;i++)

{

printf("%s",buf);

}

printf("\n");

//销毁信号量

sem_destroy(sem);

return0;

}

为了更好的感受线程间的同步的重要性,可以将线程函数中的互斥量和信号量注释掉进行测试,可以更好的掌握线程同步问题。

Coding13

1