2010-03-02 28 views
13

Nếu tôi cấp phát bộ nhớ trong một chuỗi trong C++ (hoặc mới hoặc malloc), tôi có thể phân bổ bộ nhớ trong một chuỗi khác hoặc cả hai đều xuất hiện trong cùng một chủ đề? Lý tưởng nhất, tôi muốn tránh điều này ở nơi đầu tiên, nhưng tôi tò mò muốn biết là nó hợp pháp, bất hợp pháp hoặc thực hiện phụ thuộc.Nếu tôi cấp phát bộ nhớ trong một chuỗi trong C++, tôi có thể phân bổ bộ nhớ trong một số khác

Edit: Các trình biên dịch Tôi hiện đang sử dụng bao gồm VS2003, VS2008 và Embedded C++ 4.0, nhắm mục tiêu XP, Vista, Windows 7 và hương vị khác nhau của Windows CE/PocketPC & Mobile. Vì vậy, về cơ bản tất cả Microsoft, nhưng trên một loạt các nền tảng bí truyền.

+2

Chủ đề không được nói gì cả trong tiêu chuẩn C++. Đó là tất cả việc triển khai cụ thể. – legends2k

+0

nếu bạn nói sử dụng trình biên dịch phù thủy, os vv bạn đang sử dụng, bạn có thể nhận được một số trả lời hữu ích hơn –

+0

@Ian, trình biên dịch và chi tiết hệ điều hành được thêm vào. –

Trả lời

17

Nói chung, malloc/new/free/delete trên hệ thống đa luồng là thread an toàn, do đó, điều này sẽ không có vấn đề - và phân bổ trong một chủ đề, deallocating trong khác là một điều khá phổ biến để làm.

Vì chủ đề là một tính năng triển khai, nó chắc chắn là phụ thuộc triển khai thực hiện mặc dù - ví dụ: một số hệ thống yêu cầu bạn liên kết với một thư viện thời gian chạy đa luồng.

+1

+1 - chỉ là về câu trả lời hoàn hảo. –

1

Xin lỗi vì câu trả lời vô ích này, nhưng C++ Standard không có chủ đề, vì vậy tất cả các phiên cược đều bị tắt!

Tuy nhiên, một số trình biên dịch C++ và hệ thống thời gian chạy hỗ trợ luồng, bạn thường phải yêu cầu trình liên kết sử dụng phiên bản an toàn của thư viện chuẩn.

2

Để có thể phân bổ trong một chủ đề và miễn phí trong một chuỗi khác, bạn cần thư viện thời gian chạy là luồng an toàn. Microsoft runtimes có tất cả được thread an toàn kể từ Visual Studio 2005, Visuals Studio 2003 cung cấp cả hai đơn luồng và thread runtimes an toàn - rõ ràng là bạn nên chọn để liên kết với những người đa luồng nếu bạn đang sử dụng luồng.

Cho dù đó là phụ thuộc pháp lý, bất hợp pháp hoặc thực hiện, tôi sẽ không nói điều nào ở trên. Nó hoàn toàn nằm ngoài phạm vi của tiêu chuẩn vì nó không phải là đề cập đến luồng.

+0

Cảm ơn Joe, cũng đáng biết vì chúng tôi vẫn có một số phát triển ngồi trên VS2003. –

+0

VS2003 cung cấp cả hai runtimes đa luồng và đơn luồng - bạn chỉ cần chắc chắn rằng bạn đang liên kết với những cái đúng. –

1

Tôi tin rằng đó là triển khai được xác định vì C++ Standard không nói gì về cách chuỗi sẽ chia sẻ không gian địa chỉ.

0

nó hoạt động vì đề thuộc về quá trình tương tự và chia sẻ không gian địa chỉ cùng ..

6

Có gì về mới là/xóa mình mà ngăn cản bạn từ việc phân bổ và thu hồi trong chủ đề riêng biệt. Như nhiều người đã nói, tiêu chuẩn là im lặng trên đa luồng - không có hỗ trợ cho đa luồng, cũng không có bất cứ điều gì ngăn cản bạn làm điều đó bằng cách sử dụng bất kỳ cơ sở tiêu chuẩn. Đây là cả hai tốt và xấu trong đó bạn có thể làm bất cứ điều gì bạn muốn, nhưng ngôn ngữ cung cấp không có cơ chế trực tiếp để giúp bạn làm điều đó một cách an toàn.

Có nhiều vấn đề kỹ thuật tiềm ẩn mà bạn có thể cần phải tranh luận. Nhiều trình biên dịch có các hương vị đa luồng và đơn luồng của các thư viện thời gian chạy thực hiện xóa & mới, vì vậy bạn phải chắc chắn rằng bạn sử dụng đúng. (VS 2008 đã thực hiện với CRT đơn luồng, vì vậy đây không phải là vấn đề ở đó.) Quan trọng hơn, phần mềm của bạn phải được thiết kế từ dưới lên để nhận biết đa luồng, và đây là thách thức lớn nhất đối với chúng tôi. Tài nguyên cần được bảo vệ, quyền sở hữu phải rõ ràng và bạn cần phải tránh các trường hợp nguy hiểm & điều kiện chủng tộc. Nhưng trong khi điều này có lẽ là thách thức quan trọng và khó khăn nhất mà bạn phải đối mặt khi phân bổ và deallocating trong chủ đề riêng biệt, nó không liên quan trực tiếp đến câu hỏi của bạn, vì vậy tôi sẽ để lại cho một cuộc thảo luận khác.

+0

Cảm ơn bạn đã trả lời John. Tôi giữ câu hỏi cố tình thu hẹp như tôi biết rằng thảo luận về những cạm bẫy tiềm năng của việc viết mã đa luồng sẽ có một cuốn sách lớn. Tôi nói điều này đã rơi vào nhiều hố nói trên bản thân mình nhiều hơn một lần;) –

+0

Nó giống như chơi một trò chơi Activision cũ, phải không? –

Các vấn đề liên quan