我正在学习如何使用多线程,在遇到一个练习时遇到了一个问题。
如何使用函数将结构的布尔值更改为true?(我的指针不好(。锁应该在主功能中。其目的是锁定线程,并防止其他线程在达到该状态后执行。
pd:我使用pthreads
typedef struct Data{
bool used;
}data;
void lock(data *info){
info -> used = true;
}
使用&
运算符获取对象的地址。地址是指向对象的指针。
typedef struct Data{
bool used;
}data;
void lock(data *info){
info -> used = true;
}
int main(int argc, char *argv[])
{
data my_struct = {0};
lock(&my_struct);
if (my_struct.used == true)
printf("It is true!n");
return 0;
}
我对您的情况的理解是,您希望在锁函数中使用pthread锁来保护写操作(info->used=true(。
在使用lock(Data*(函数之前,您应该创建pthread_mutex_t(用于锁定的数据结构(。下面是一个例子。
#include <stdio.h>
#include <stdbool.h>
#include <pthread.h>
typedef struct data
{
bool used;
}data;
pthread_mutex_t spin_lock;
void* lock(void *xxinfo)
{
if (xxinfo != NULL)
{
data *info= (data *)xxinfo;
pthread_mutex_lock(&spin_lock);
info->used = true;
printf("Set the used statusn");
pthread_mutex_unlock(&spin_lock);
}
return NULL;
}
pthread_t threads[2]; // Used it for demonstrating only
int main()
{
int status = 0;
data some_data;
if(0 != pthread_mutex_init(&spin_lock, NULL))
{
printf("Error: Could not initialize the lockn");
return -1;
}
status = pthread_create(&threads[0], NULL, &lock, &some_data);
if (status != 0)
{
printf("Error: Could not create 0th threadn");
}
status = pthread_create(&threads[1], NULL, &lock, &some_data);
if (status != 0)
{
printf("Error: Could not create 1st threadn");
}
pthread_join(threads[0], NULL);
pthread_join(threads[1], NULL);
pthread_mutex_destroy(&spin_lock);
return 0;
}
在这个例子中,我使用全局spin_lock(这不是一个好主意(。在代码中,请考虑将其保留在适当的范围内。我在这里创建了两个线程进行演示。据我所知,他们根本不参加比赛。我希望这能给你一个在你的案例中使用pthread锁的想法。您应该仅对代码中修改或读取数据的部分使用锁。
请注意,您应该创建锁<pthread_mutex_init>在创建线程之前。您也可以将锁作为参数发送到线程。
使用后销毁锁。