OpenMP编程->互斥锁函数

本文通过几个示例介绍了并行编程中互斥锁的使用方法,包括互斥锁的初始化、设置与释放,以及如何利用互斥锁来保护共享资源不受多个线程的同时访问。


//互斥锁同步   #pragma opm atomic   x< + or * or - or * or  / or & or | or << or >> >=expr
void test9()
{
	int sum = 0;   

	std::cout << "Before: " << sum << std::endl;  
omp_set_num_threads(3); 
#pragma omp parallel for  
	for (int i = 0; i < 20000; ++i)   
	{  
#pragma omp atomic  
		sum++;
		//cout<<"ID "<<omp_get_thread_num()<<endl;
	}  

	std::cout << "After: " << sum << std::endl;  
}

//临界区声明方法,可以对某个并行程序块进行防护。
void test10()
{
	int sum = 0;   

	std::cout << "Before: " << sum << std::endl;  

#pragma omp parallel for  
	for (int i = 0; i < 100; ++i)   
	{  
#pragma omp critical (a)  
		{  
			test9();
			sum = sum + i * 2;  
		}  
	}  

	std::cout << "After: " << sum << std::endl; 
}


/*  对for循环中的所有内容进行加锁保护,同时只能有一个线程执行for循环中的内容。  */
static omp_lock_t lock; 
void test11()
{
	omp_init_lock(&lock); // 初始化互斥锁  

#pragma omp parallel for  
	for (int i = 0; i < 5; ++i)   
	{  
		omp_set_lock(&lock); //获得互斥器   
		std::cout << omp_get_thread_num() << "+" << std::endl;  
		std::cout << omp_get_thread_num() << "-" << std::endl;  
		omp_unset_lock(&lock); //释放互斥器  
	}  

	omp_destroy_lock(&lock); //销毁互斥器  
}


以下是我的代码: #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <math.h> // 待积分函数 f(x) = x^2 double f(double x) { return x * x; } // 互斥锁用于保护全局结果 pthread_mutex_t mutex; // 线程参数结构体 typedef struct { double a; double b; int n; double h; double* global_result_p; int thread_count; int my_rank; } Trap_args; // Pthread 线程执行函数 void* Trap_pthread(void* rank_void_ptr) { Trap_args* args = (Trap_args*)rank_void_ptr; double local_a, local_b, my_result; int i, local_n; // 1. 计算每个线程负责的梯形数量 local_n = args->n / args->thread_count; // 2. 计算每个线程负责的区间 [local_a, local_b] local_a = args->a + args->my_rank * local_n * args->h; local_b = local_a + local_n * args->h; // 3. 计算局部积分 my_result = (f(local_a) + f(local_b)) / 2.0; for (i = 1; i <= local_n - 1; i++) { my_result += f(local_a + i * args->h); } my_result = my_result * args->h; // 4. 使用互斥锁保护全局结果的累加 (相当于 OpenMP 的 critical 或 reduction) pthread_mutex_lock(&mutex); *(args->global_result_p) += my_result; pthread_mutex_unlock(&mutex); return NULL; } // Pthread 主函数 int main_pthread(int argc, char* argv[]) { double a = 0.0, b = 1.0; int n = 1000000; double global_result = 0.0; int thread_count = 4; // 示例线程数 double h; if (argc > 1) { thread_count = strtol(argv[1], NULL, 10); } h = (b - a) / n; pthread_t* thread_handles; Trap_args* args_array; // 初始化互斥锁 pthread_mutex_init(&mutex, NULL); thread_handles = (pthread_t*)malloc(thread_count * sizeof(pthread_t)); args_array = (Trap_args*)malloc(thread_count * sizeof(Trap_args)); // 创建线程 for (int rank = 0; rank < thread_count; rank++) { args_array[rank].a = a; args_array[rank].b = b; args_array[rank].n = n; args_array[rank].h = h; args_array[rank].global_result_p = &global_result; args_array[rank].thread_count = thread_count; args_array[rank].my_rank = rank; pthread_create(&thread_handles[rank], NULL, Trap_pthread, (void*)&args_array[rank]); } // 等待所有线程完成 for (int rank = 0; rank < thread_count; rank++) { pthread_join(thread_handles[rank], NULL); } // 清理资源 free(thread_handles); free(args_array); pthread_mutex_destroy(&mutex); printf("Pthread Result (Threads: %d): %.14e\n", thread_count, global_result); return 0; }
最新发布
11-20
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值