【发布时间】:2019-05-22 20:00:47
【问题描述】:
我在 C++ 的 2 个或更多线程之间共享列表时遇到问题。我在 main() 中初始化我的列表,然后创建线程,将列表对象指针作为参数传递:
pthread_create(&(tid[i]), NULL, &threadfunction, &l);
&l 是参数。这是从 2 个或更多线程操作同一列表的正确方法吗?我使用一个简单的互斥锁来锁定/解锁,因此一次访问它的线程不超过一个。
编辑:下面的代码
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include "list.h"
using namespace std;
int count = 0;
pthread_t tid[2];
pthread_mutex_t lock;
void* trythis(void *arg)
{
pthread_mutex_lock(&lock);
printf("Starting thread\n");
count++;
printf("%d\n", count);
if(count == 1)
{
((list *)arg)->Append((char *)"some", (char *)"thing");
printf("Appending done\n");
}
else
{
((list *)arg)->Append((char *)"some", (char *)"else");
printf("Appending done\n");
}
pthread_mutex_unlock(&lock);
return NULL;
}
int main(void)
{
list* l = new list();
int i = 0;
printf("Starting\n");
if (pthread_mutex_init(&lock, NULL) != 0)
{
printf("mutex init has failed\n");
return 1;
}
while(i < 2)
{
int err = pthread_create(&(tid[i]), NULL, &trythis, &l);
if (err != 0)
printf("\nThread can't be created :[%s]", strerror(err));
i++;
}
pthread_join(tid[0], NULL);
printf("Im out 1\n");
pthread_join(tid[1], NULL);
printf("Im out 2\n");
pthread_mutex_destroy(&lock);
delete l;
return 0;
}
Append() 函数只是在列表中添加一些元素(每个列表节点都有 2 个 char* 成员)。
【问题讨论】:
-
一定要使用
pthread吗? C++11+ 带有内置的线程支持,它是类型安全的,可以让你摆脱pthread使用的所有类型转换和void*。 -
是的,我不得不遗憾地使用 pthread
-
显示代码的其他部分。只要列表没有超出范围就可以了。
-
这将创建线程,但要告诉您同步是否正确,我们需要查看同步代码。
-
@FraPapas on Linux std::thread 使用 pthread,所以从技术上讲,您正在使用它。作业要求?
标签: c++ linux multithreading