c - pthread_mutex_t 在结构中并在访问时锁定结构
问题描述
我有一个全局结构指针,我已经完成了一个 malloc(10 个结构的数组),并且我已经向每个线程发送了这个结构的一个实例,并且在将此结构实例作为参数传递给 pthread_create() 之前,我正在更新结构成员值。在每个线程中,我将锁定并打印成员值。
我创建了另一个线程,在其中我传递了整个结构实例,我锁定了每个结构实例并打印它,但每次它打印 0。你能否建议我必须进行哪些更改。
我不想使用任何线程条件,因为我正在每个线程中睡觉以进行线程切换。
#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
struct lock_check{
int value;
pthread_mutex_t lock;
};
struct lock_check *check;
void* trythis(void *arg)
{
struct lock_check *thread = (struct lock_check *)arg;
while(1){
pthread_mutex_lock(&thread->lock);
printf("Inside Thread with value:%d\n", thread->value);
pthread_mutex_unlock(&thread->lock);
sleep(1);
}
return NULL;
}
void* printthis(void *arg)
{
printf("Entering printthis thread\n");
struct lock_check *print_thread = (struct lock_check *)arg;
for(int i = 0; i < 10; i++){
pthread_mutex_lock(&print_thread[i].lock);
printf("Printing value :%d\n", print_thread[i].value);
pthread_mutex_unlock(&print_thread[i].lock);
}
return NULL;
}
int main(void)
{
int i = 0;
int error;
check = malloc(sizeof(struct lock_check) * 10);
pthread_t tid[10];
pthread_t tid_read;
for (int i = 0; i < 10; i++) {
check[i].value = i;
error = pthread_create(&(tid[i]), NULL, &trythis, &check[i]);
if (error != 0)
printf("\nThread can't be created :[%s]", strerror(error));
}
sleep(5);
printf("creating printthis thread\n");
error = pthread_create(&tid_read, NULL, &printthis, &check);
for (int i = 0; i < 10; i++) {
pthread_join(tid[i], NULL);
}
pthread_join(tid_read, NULL);
return 0;
}
解决方案
error = pthread_create(&tid_read, NULL, &printthis, &check);
pthread_create
正在期待void *
,但您正在传递struct lock_check **
未定义的行为。
改成。
error = pthread_create(&tid_read, NULL, &printthis, check);
推荐阅读
- javascript - 正则表达式匹配 csv 字符串中的项目
- python - 需要帮助将可在 Google App Engine、Flex 环境中运行的应用程序容器化
- python - 如果密钥存在,则在 mongo 中插入多个文档将忽略 continue_on_error=True 不起作用
- python - 将 cache() 和 count() 应用于 Databricks 中的 Spark Dataframe 非常慢 [pyspark]
- swift - 我的 applicationWillEnterForeground 函数在 Xcode 11 中不起作用。我该怎么办?
- python - CountVectorizer fit_transform 花费的时间太长
- javascript - 为什么我在 React-Native 中的 FlatList 没有更新,即使添加了额外数据?
- angular - Angular - 如何在浏览器后退导航中维护应用程序状态
- python - pyqtgraph.GraphicsObject 可以在两个图中吗
- python-3.x - 如何在一行中使用 getch() 打印?