
Ubuntu下的多线程编程
发布日期:2021-05-06 22:01:48
浏览次数:30
分类:技术文章
本文共 4535 字,大约阅读时间需要 15 分钟。
转自https://computing.llnl.gov/tutorials/pthreads/
#include#include #include #include #define NUM_THREADS 3#define TCOUNT 10#define COUNT_LIMIT 12int count = 0;pthread_mutex_t count_mutex;pthread_cond_t count_threshold_cv;void *inc_count(void *t){ int i; long my_id = (long)t; for (i=0; i < TCOUNT; i++) { pthread_mutex_lock(&count_mutex); count++; /* Check the value of count and signal waiting thread when condition is reached. Note that this occurs while mutex is locked. */ if (count == COUNT_LIMIT) { printf("inc_count(): thread %ld, count = %d Threshold reached. ", my_id, count); pthread_cond_signal(&count_threshold_cv); printf("Just sent signal.\n"); } printf("inc_count(): thread %ld, count = %d, unlocking mutex\n", my_id, count); pthread_mutex_unlock(&count_mutex); /* Do some work so threads can alternate on mutex lock */ sleep(1); } pthread_exit(NULL);}void *watch_count(void *t){ long my_id = (long)t; printf("Starting watch_count(): thread %ld\n", my_id); /* Lock mutex and wait for signal. Note that the pthread_cond_wait routine will automatically and atomically unlock mutex while it waits. !!!pthread_cond_wait进入等待时会自动解锁mutex Also, note that if COUNT_LIMIT is reached before this routine is run by the waiting thread, the loop will be skipped to prevent pthread_cond_wait from never returning. !!!如果while循环条件跳出,会提前结束等待状态 */ pthread_mutex_lock(&count_mutex); while (count < COUNT_LIMIT) { printf("watch_count(): thread %ld Count= %d. Going into wait...\n", my_id,count); pthread_cond_wait(&count_threshold_cv, &count_mutex); printf("watch_count(): thread %ld Condition signal received. Count= %d\n", my_id,count); } printf("watch_count(): thread %ld Updating the value of count...\n", my_id); count += 125; printf("watch_count(): thread %ld count now = %d.\n", my_id, count); printf("watch_count(): thread %ld Unlocking mutex.\n", my_id); pthread_mutex_unlock(&count_mutex); pthread_exit(NULL);}int main(int argc, char *argv[]){ int i, rc; long t1=1, t2=2, t3=3; pthread_t threads[3]; pthread_attr_t attr; /* Initialize mutex and condition variable objects */ pthread_mutex_init(&count_mutex, NULL); pthread_cond_init (&count_threshold_cv, NULL); /* For portability, explicitly create threads in a joinable state */ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_create(&threads[0], &attr, watch_count, (void *)t1); pthread_create(&threads[1], &attr, inc_count, (void *)t2); pthread_create(&threads[2], &attr, inc_count, (void *)t3); /* Wait for all threads to complete */ for (i = 0; i < NUM_THREADS; i++) { pthread_join(threads[i], NULL); } printf ("Main(): Waited and joined with %d threads. Final value of count = %d. Done.\n", NUM_THREADS, count); /* Clean up and exit */ pthread_attr_destroy(&attr); pthread_mutex_destroy(&count_mutex); pthread_cond_destroy(&count_threshold_cv); pthread_exit (NULL);}
输出
inc_count(): thread 3, count = 1, unlocking mutexinc_count(): thread 2, count = 2, unlocking mutexStarting watch_count(): thread 1watch_count(): thread 1 Count= 2. Going into wait...inc_count(): thread 3, count = 3, unlocking mutexinc_count(): thread 2, count = 4, unlocking mutexinc_count(): thread 3, count = 5, unlocking mutexinc_count(): thread 2, count = 6, unlocking mutexinc_count(): thread 3, count = 7, unlocking mutexinc_count(): thread 2, count = 8, unlocking mutexinc_count(): thread 3, count = 9, unlocking mutexinc_count(): thread 2, count = 10, unlocking mutexinc_count(): thread 3, count = 11, unlocking mutexinc_count(): thread 2, count = 12 Threshold reached. Just sent signal.inc_count(): thread 2, count = 12, unlocking mutexwatch_count(): thread 1 Condition signal received. Count= 12watch_count(): thread 1 Updating the value of count...watch_count(): thread 1 count now = 137.watch_count(): thread 1 Unlocking mutex.inc_count(): thread 3, count = 138, unlocking mutexinc_count(): thread 2, count = 139, unlocking mutexinc_count(): thread 3, count = 140, unlocking mutexinc_count(): thread 2, count = 141, unlocking mutexinc_count(): thread 3, count = 142, unlocking mutexinc_count(): thread 2, count = 143, unlocking mutexinc_count(): thread 3, count = 144, unlocking mutexinc_count(): thread 2, count = 145, unlocking mutexMain(): Waited and joined with 3 threads. Final value of count = 145. Done.
发表评论
最新留言
很好
[***.229.124.182]2025年03月19日 18时37分43秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
c++ primer 5th 练习11.9自己编写的答案
2019-03-04
web实现断点续传
2019-03-04
自定义BootstrapTable扩展:分页跳转到指定页码
2019-03-04
Python3逻辑运算符
2019-03-04
【学习笔记】欧拉函数,欧拉公式
2019-03-04
Python3序列
2019-03-04
vue-cli中找不到jquery的原因,以使用ztree为例
2019-03-04
React中设置404页面
2019-03-04
BootstrapValidator手动触发部分验证
2019-03-04
vue调试工具vue-devtools安装及使用
2019-03-04
CSS总结div中的内容垂直居中的四种方法
2019-03-04
[BZOJ4878]挑战NP-Hard
2019-03-04
vue指令之v-for
2019-03-04
[CF1278F]Cards
2019-03-04
jQuery实现无刷新切换主题皮肤功能
2019-03-04
[CF932E]Team Work
2019-03-04
用postman测试url参数
2019-03-04
Random IS
2019-03-04
Vue的is属性
2019-03-04
Vue爬坑之v-model和v-bind(二)
2019-03-04